2013-11-20 47 views
0

我有一個運行緩慢的更新語句,我很好奇如果將where條件移動到join子句可以提高性能。這裏的查詢:將where子句移動到join子句是否可以提高性能?

update T1 inner join (select ID, GROUP_CONCAT(x) as X from T3 group by ID) as T2 

on T1.ID=T2.ID set T1.X=T2.X where T1.TYPE='something'; 

現在...對於一個非常大的表(數百萬條記錄),這樣做會更快嗎?

update T1 inner join (select ID, GROUP_CONCAT(x) as X from T3 group by ID) as T2 

on T1.ID=T2.ID and T1.TYPE='something' set T1.X=T2.X; 
+0

T1中有多少行數有TYPE ='something'? T2中相應行的分數是否相同? T1中每行有多少行通常在T2? – Bohemian

回答

0

該查詢非常簡單,兩種方法應該相同地進行優化。

這兩種方法也可能是次優的,因爲內部查詢與外部查詢不相關。您的查詢正在創建一個隱含的臨時表,其中包含派生表T2的所有可能行 - 與如果您自己單獨運行查詢select ID, GROUP_CONCAT(x) as X from T3 group by ID的結果完全相同 - 然後服務器將丟棄無法連接到T1的行並使用其餘的來做更新。

這很可能不是最佳路徑。

除非t1.TYPE =「某物」涉及在T1中的行的大百分比,它應該是更有效地做到這一點:

UPDATE t1 
    SET t1.x = (SELECT GROUP_CONCAT(x) FROM T3 WHERE T3.id = T1.id GROUP BY T3.id) 
WHERE t1.TYPE = 'something'; 

內子查詢只關聯於外子查詢,並對於與WHERE子句相匹配的T1中的行執行。