我有两个表,TABLE1和TABLE2,每个表都有几百万行。基于ID更新TABLE1中的列,该ID具有TABLE2中的特定功能。
请有人向我解释一下,为什么下面的第二个解决方案需要30秒,而第一个解决方案在5个小时后甚至没有完成?我认为需要创建一个新表并在更新完成后删除它的代码不是一个好的编码风格。但在这种情况下速度要快得多。有推荐吗?
(1)永远需要:
UPDATE TABLE1 SET TABLE1.MYCOLUMN = 1 WHERE TABLE1.ID IN (SELECT distinct(ID) FROM TABLE2 where .... );
(2)需要30秒:
CREATE TABLE TABLE3 AS (SELECT distinct(ID) FROM TABLE2 where ....); ALTER TABLE TABLE3 ADD primary key(ID); UPDATE TABLE1 SET TABLE1.MYCOLUMN = 1 WHERE TABLE1.ID IN (SELECT * FROM TABLE3);
发布于 2015-05-16 22:06:05
一般来说,WHERE IN (some query returning lots of rows)表现很差。尽管优化器应该能够将其转换为一个联接,但通常不会,这意味着整个结果集必须存储在内存中,不会被索引。
尝试使用mysql的多表更新语法:
UPDATE TABLE1
JOIN TABLE2 ON TABLE1.ID = TABLE2.ID
SET TABLE1.MYCOLUMN = 1确保TABLE1.ID上有索引,TABLE2.ID上有索引。
https://stackoverflow.com/questions/30281021
复制相似问题