2张表的Mysql优化查询

标签 mysql select optimization

让db1和db2 db1.table1

annee   code    code2   var1    ....
1991    11    12    779
1991    11    14    105
1991    11    15    10
1991    12    11    466
1991    12    14    296
1991    12    15    270
1991    14    11    15
1991    14    12    510
1991    14    15    6
1991    15    11    193
1991    15    12    455
1991    15    14    4   
....
1992    11    12    779
1992    11    14    105
1992    11    15    10
1992    12    11    466
1992    12    14    296
1992    12    15    270
1992    14    11    15
1992    14    12    510
1992    14    15    6
1992    15    11    193
1992    15    12    455
1992    15    14    4   
....

db2.table2

var1    code    ...
test  11
test  12
test  14
test2 11
test2 14
test2 15
...

我需要优化以下查询(因为 db1.table1 包含 8 000 000 行):

select annee,sum(var1) from db1.table1 as M where 
M.code in 
(select t1.code from db2.table2 as t1 cross join db2.table2 as t2 where t1.var1='Test2' and t2.var1='Test2' and t1.code <> t2.code) 
and M.code2 in 
(select t2.code from db2.table2 as t1 cross join db2.table2 as t2 where t1.var1='Test2' and t2.var1='Test2' and t1.code <> t2.code) 
group by annee order by annee desc

db1.table1 和 db2.table2 被索引和排序。 任何建议将不胜感激! 谢谢

最佳答案

作为变体,您可以尝试以下操作

select m.annee,sum(m.var1)
from db1.table1 m
join
  (
    select t1.code code1,t2.code code2
    from db2.table2 t1
    join db2.table2 t2 on t1.var1='Test2' and t2.var1=t1.var1 and t1.code<t2.code
  ) c
on (m.code=c.code1 and m.code2=c.code2) or (m.code=c.code2 and m.code2=c.code1)
group by m.annee
order by m.annee desc

我使用 JOIN 而不是 CROSS JOINJOIN 而不是两个 IN

如果适合你,你可以尝试优化查询

select m.annee,sum(m.var1)
from db2.table2 t1
join db2.table2 t2 on t1.var1='Test2' and t2.var1=t1.var1 and t1.code<t2.code
join db1.table1 m on (m.code=t1.code and m.code2=t2.code) or (m.code=t2.code and m.code2=t1.code)
group by m.annee
order by m.annee desc

第一个 JOIN 返回 test2 的所有组合。有(11,12)和(11,14)

db2.table2 t1
join db2.table2 t2 on t1.var1='Test2' and t2.var1=t1.var1 and t1.code<t2.code

第二个 JOIN 检查 table1 中这些组合的行

join db1.table1 m on (m.code=t1.code and m.code2=t2.code) or (m.code=t2.code and m.code2=t1.code)

也尝试检查下一个变体

select m.annee,sum(m.var1)
from db2.table2 t1
join db2.table2 t2 on t1.var1='Test2' and t2.var1=t1.var1 and t1.code<>t2.code
join db1.table1 m on m.code=t1.code and m.code2=t2.code
group by m.annee
order by m.annee desc

如果最后一个变体返回正确的结果,那么您可以尝试将 (code,code2) 的索引添加到 table1

CREATE INDEX idx_table1_code_code2 ON db1.table1 (code,code2)

关于2张表的Mysql优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47937590/

相关文章:

java - 单击超链接时将一行从一个表插入到mysql中的另一个表

mysql - 更新 MySQL 中的第二行

php - 如何检查Mysql表中是否存在记录

c++ - 从源代码构建编译器是否会带来更好的优化?

php - 使用生成的 GROUP BY 语句优化 SQL 查询

MYSQL数据库设计: How to store 3 Dimensional data for every user?

mysql - 循环访问模型中的表列值

VB.Net DataTable.选择特定值或DBNull

MySQL根据另一个表中最近日期的价格计算值(value)

node.js - 如何优化我的 heroku web 应用程序