我需要找到表1中存在的值,但表2中不存在的值,然后从表1中删除这些值(两个表都具有主键)。问题是表太大了,下面的查询要花很多时间:
DELETE
FROM table_1 t1
WHERE NOT EXISTS ( SELECT primarykey FROM table_2 t2 WHERE t1.id = t2.primarykey )
是否有一种方法可以分块执行任务,例如一次30万行?还是更好的优化解决方案?
答案 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还讨论了批量处理表部分的情况。