SQL查询非常慢 - 我该如何改进它?

时间:2016-06-15 19:20:29

标签: mysql sql

我正在管理数据库,我想知道是否有更酷的方法来进行此查询。

我的实际查询:

SELECT * FROM mytable 
LEFT JOIN table1 AS m1 ON mytable.idA=m1.K 
LEFT JOIN table1 AS m2 ON mytable.idB=m2.K 
LEFT JOIN table1 AS m3 ON mytable.idC=m3.K 
LEFT JOIN table1 AS m4 ON mytable.idD=m4.K 
LEFT OUTER JOIN table2 AS t1 ON mytable.idK1= t1.idK1 AND mytable.idK2= t1.idK2
LEFT OUTER JOIN table3 ON t1.idT = table3.idT
WHERE m1.K = "my_value" OR m2.K = "my_value" OR m3.K = "my_value" OR m4.K = "my_value"

我有一个查询在同一个其他表上进行4次连接,因为我可以在字段idA,idB,idC或idD中获得值。 之后,我与其他表格进行了其他2次连接。

我的问题是:
我可以改进这段代码吗?是否有更聪明的方法来实现它或更好的逻辑? 非常感谢,即使是理论上的解释。

2 个答案:

答案 0 :(得分:2)

考虑您可以索引哪些列:=IFERROR(INDEX( $B$2:$B$13,INDEX(MODE.MULT(IF($A$2:$A$13=$A2,MATCH($B$2:$B$13,$B$2:$B$13,0))),ROWS($C2:C2)) ),"") mytable.idAmytable.idBmytable.idCmytable.idDtable1.K,{{ 1}}。

还要考虑是否可以为table2.idTtable2.idT创建索引;另一个用于table2.idK1table2.idK2

答案 1 :(得分:0)

我尝试过这样做,执行时间确实更好:

SELECT * FROM (
SELECT * FROM mytable WHERE idA = "my_value" OR idB = "my_value" OR idC = "my_value" OR idD = "my_value"
) as p1
LEFT JOIN table1 AS m1 ON p1.idA=m1.K 
LEFT JOIN table1 AS m2 ON p1.idB=m2.K 
LEFT JOIN table1 AS m3 ON p1.idC=m3.K 
LEFT JOIN table1 AS m4 ON p1.idD=m4.K 
LEFT OUTER JOIN table2 AS t1 ON p1.idK1= t1.idK1 AND p1.idK2=  t1.idK2
LEFT OUTER JOIN table3 ON t1.idT = table3.idT

现在执行时间是0.06秒,然后是1.5-2秒。


我可以引起一些问题吗?查询似乎运作良好