2011-11-17 44 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

相關問題