MySQL比较并删除约30m条大表

时间:2018-12-18 12:43:43

标签: php mysql sql performance

我需要找到表1中存在的值,但表2中不存在的值,然后从表1中删除这些值(两个表都具有主键)。问题是表太大了,下面的查询要花很多时间:

DELETE
FROM table_1 t1
WHERE NOT EXISTS ( SELECT primarykey FROM table_2 t2 WHERE t1.id = t2.primarykey )

是否有一种方法可以分块执行任务,例如一次30万行?还是更好的优化解决方案?

2 个答案:

答案 0 :(得分:4)

我将使用左联接代替子查询;那会快很多。然后,对于联接表中不能具有$client = new Client($keySid, $keySecret, $accountSid);值的字段,可以删除联接中具有NULL值的行。

这看起来像这样:

NULL

答案 1 :(得分:1)

一次仅删除1K行。请记住,万一发生崩溃,InnoDB需要挂在所有已删除的行上。 (然后它可能ROLLBACK变得一团糟。)如果确实要大块删除,请使用OFFSET。而是使用PRIMARY KEY逐步完成。 (有关更多详细信息,请参见下面的链接。)

如果要删除表的大多数行,则这样做要快得多

CREATE TABLE new ...;   -- either say "LIKE real" or spell out schema
INSERT INTO new
    SELECT ... FROM real WHERE opposite-test;
RENAME TABLE real TO old,
             new TO real;   -- atomic and fast
DROP TABLE old;   -- after you verify that it worked.

有关大删除的更多提示:http://mysql.rjweb.org/doc.php/deletebig
This还讨论了批量处理表部分的情况。