2011-11-17 102 views
4

我有一个类似于下面简化的数据库。我需要检索列:col8,col9,col10,col11,COL12(我已经盘旋左连接优化

目前的,我;使用左男加入加入各表,但是这会导致查询花了很长时间(有很多的记录)。经分析,最大的影响是写入TMP表。

我限制了结果24,但由于左加入它仍然复制几千条记录到tmp目录表。

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

这能优化仍检索使用joinin每个表中的列盘旋g由pk?

谢谢。

+1

良好的形象;-)但我们仍然不知道任何关于您的表和索引。我想说,用于连接表的所有字段(ON子句)都应该使用主键,唯一键或索引来索引。 – Devart

+0

哈哈,谢谢。我只是更新它使*希望*更清晰。每个表的第一列是主键,每个连接表都有一个对应的外键。 – Jarrod

+0

@Devart - +1。如果索引正确应用,查询应该是相当快的,除非还有其他事情涉及(按?排序?有?)。左连接不会比内连接更差。我们是否可以看到您正在使用的查询以及哪些索引在哪里? –

回答

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连接。
如果你不需要子选择,你应该消除它,因为它会减慢速度。

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 

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