将where子句移动到join子句是否可以提高性能?

时间:2013-11-20 21:03:25

标签: mysql

我有一个运行缓慢的更新语句,如果将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;

1 个答案:

答案 0 :(得分:0)

查询很简单,两种方法都应该完全相同。

两种方法也可能是次优的,因为内部查询与外部查询无关。您的查询正在创建一个隐式临时表,其中包含派生表T2的所有可能行 - 与您仅运行查询select ID, GROUP_CONCAT(x) as X from T3 group by ID完全相同的结果 - 然后服务器丢弃那些不能加入T1并使用其余部分进行更新。

这很可能不是最佳路径。

除非t1.TYPE ='something'涉及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';

内部子查询与外部子查询相关联,并且仅针对T1中与WHERE子句匹配的行执行。