2011-11-17 43 views
3

目前我在做大规模删除使用以下查询的变化:什么是最好的质量删除查询?

DELETE FROM t1 WHERE t1.key NOT IN (SELECT t2.key FROM t2) 

有人告诉我,子查询在MySQL太慢,应该进行优化。但我找不到一个更好的例子。是否有可能做一个加入和删除?

+0

可能会在使用限制 –

回答

4
DELETE FROM t1 USING t1 JOIN t2 ON t1.key = t2.key LIMIT 1000; 

并重复,直到没有剩余,这允许长时间不阻塞表。

UPD:但是如果你需要加入同一个表,这个解决方案将无法工作。

UPD2:我忽略了NOT,这里是修正查询:

DELETE FROM t1 
USING t1 LEFT JOIN t2 ON t1.key = t2.key 
WHERE t2.key IS NULL 
LIMIT 1000; 

我要指出,这是子查询会以相同的速度作为连接完成的情况下,考虑的good postQuassnoi关于这个问题。

+0

块中使用。有关更多信息,请参见[DELETE语法](http://dev.mysql.com/doc/refman/5.0/en/delete.html)以及[JOIN语法]( http://dev.mysql.com/doc/refman/5.0/en/join.html)(table_references)。对不起,我以前不可原谅的错误。 – dave

+0

@newtover:在我的情况下,我删除不存在于t2中的条目。你能告诉我,如果你的查询的变体在这种情况下会起作用吗? – ryy

+0

@ryy,done =)现在应该可以。 – newtover

相关问题