我正在管理数据库,我想知道是否有更酷的方法来进行此查询。
我的实际查询:
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次连接。
我的问题是:
我可以改进这段代码吗?是否有更聪明的方法来实现它或更好的逻辑?
非常感谢,即使是理论上的解释。
答案 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.idA
,mytable.idB
,mytable.idC
,mytable.idD
,table1.K
,{{ 1}}。
还要考虑是否可以为table2.idT
和table2.idT
创建索引;另一个用于table2.idK1
和table2.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秒。
我可以引起一些问题吗?查询似乎运作良好