此查询需要从包含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/

10-10 03:21