我需要找到表1中存在但表2中不存在的值,并从表1中删除这些值(两个表都有主键)。问题是表太大,下面这样的查询需要很多时间:
DELETE FROM table_1 t1 WHERE NOT EXISTS ( SELECT primarykey FROM table_2 t2 WHERE t1.id = t2.primarykey )
有没有一种方法可以一次执行30万行这样的任务?或者更好的优化方案?
a2mppw5e1#
我将使用左连接而不是子查询;那就快多了。然后可以删除具有 NULL 联接表中不能具有 NULL 价值观。看起来像这样:
NULL
DELETE table_1 FROM table_1 t1 LEFT JOIN table_2 t2 ON t1.id = t2.primarykey WHERE t2.id IS NULL
g2ieeal72#
一次只删除1k行。请记住,innodb需要挂起所有已删除的行,以防崩溃(那就可以了 ROLLBACK 如果你要成批删除,不要使用 OFFSET . 相反,使用 PRIMARY KEY . (更多详情请参见下面的链接。)如果要删除表中的大多数行,则
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本文还讨论了批量处理表的一部分的情况。
2条答案
按热度按时间a2mppw5e1#
我将使用左连接而不是子查询;那就快多了。然后可以删除具有
NULL
联接表中不能具有NULL
价值观。看起来像这样:
g2ieeal72#
一次只删除1k行。请记住,innodb需要挂起所有已删除的行,以防崩溃(那就可以了
ROLLBACK
如果你要成批删除,不要使用OFFSET
. 相反,使用PRIMARY KEY
. (更多详情请参见下面的链接。)如果要删除表中的大多数行,则
关于大删除的更多提示:http://mysql.rjweb.org/doc.php/deletebig
本文还讨论了批量处理表的一部分的情况。