2013-11-20 45 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中的行执行。