mysql比较和删除大表~30m记录

but5z9lq  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(205)

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

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

有没有一种方法可以一次执行30万行这样的任务?或者更好的优化方案?

a2mppw5e

a2mppw5e1#

我将使用左连接而不是子查询;那就快多了。然后可以删除具有 NULL 联接表中不能具有 NULL 价值观。
看起来像这样:

DELETE table_1 
FROM table_1 t1
LEFT JOIN table_2 t2
    ON t1.id = t2.primarykey
WHERE t2.id IS NULL
g2ieeal7

g2ieeal72#

一次只删除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
本文还讨论了批量处理表的一部分的情况。

相关问题