左连接优化

时间:2011-11-17 08:51:00

标签: mysql optimization query-optimization left-join

我有一个类似于下面简化的数据库。我需要检索列:col8,col9,col10,col11,col12(我圈出的那些

目前,我使用左连接来连接每个表,但这会导致查询耗时很长(有很多记录)。在分析时,最大的影响是写入tmp表。

我将结果限制为24,但由于左连接,它仍然会将数千条记录复制到tmp表。

http://oberto.co.nz/demo/assets/db2.jpeg

这是否可以优化,以便仍然使用pk的连接从每个表中检索带圆圈的列?

感谢。

2 个答案:

答案 0 :(得分:1)

SELECT a.col12, b1.col8, c1.col9, d1.col10, e1.col11
FROM a
INNER JOIN (SELECT b.col8, b.col2, b.col3 FROM b 
            WHERE b.col2 = a.col2 GROUP BY b.col8) b1 
        ON (b1.col2 = a.col2)
INNER JOIN (SELECT c.col9, c.col3, c.col4 FROM c 
            WHERE c.col3 = b1.col3 GROUP BY c.col9) c1 
        ON (c1.col3 = b1.col3)
INNER JOIN (SELECT d.col10, d.col4 FROM d 
            WHERE d.col4 = c1.col4 GROUP BY d.col10) d1 
        ON (d1.col4 = c1.col4)
INNER JOIN (SELECT e.col11, e.col6 FROM e 
            WHERE e.col6 = a.col6 GROUP BY e.col11) e1 
        ON (e1.col6 = a.col6)

现在您将没有更多重复的行 您可能需要尝试LEFT而不是INNER加入 如果你不需要一个subselect你应该消除它,因为它减慢了事情。

答案 1 :(得分:0)

以其当前和最简单的形式,我将查询为...

SELECT STRAIGHT_JOIN
      a.col1,
      a.col12, 
      b.col8, 
      c.col9, 
      d.col10, 
      e.col11
   FROM a
      left join b
         on a.col2 = b.col2
         left join c
            on b.col3 = c.col3
            left join d
               on c.col4 = d.col4
      left join e
         on a.col6 = e.col6

但是,一旦我回读其他标准,过滤器,条件,左/内连接“要求”,可能会有助于进一步优化。