此查询需要从包含2000万行的表中删除1700多万行。
DELETE
FROM statements
WHERE agreement_id IN
(SELECT id
FROM agreements
WHERE created < DATE_SUB(CURDATE(), INTERVAL 6 MONTH));
DELETE
FROM agreements
WHERE created < DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
跑步要花上几个小时,我是不是错过了一些可以加快速度的东西?
子选择本身需要几秒钟,我不明白为什么删除需要这么长时间。
最佳答案
如果你有这么多要删除。
我建议你:
使用将保留的数据创建新的临时表。
截断主表
将数据从临时表移动到主表
或
使用将保留的数据创建新的临时表。
放下主桌
将临时表重命名为主表(不要忘记创建约束)
还有你的问题,
不要用IN子句处理大数据。相反,使用更具性能的存在。
基本脚本:
CREATE TABLE tmp_statements as
SELECT * FROM statements s where exists
(
select 1 FROM agreements a
WHERE
created < DATE_SUB(CURDATE(), INTERVAL 6 MONTH AND
s.agreement_id = a.agreement_id
));
DROP TABLE statements;
RENAME TABLE tmp_statements TO statements ;
--DONT FORGET TO RECREATE CREATE YOUR INDEXES, CONSTRAINTS;
关于mysql - 如何使用子选择优化删除查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54135906/