mysql - 如何使用子选择优化删除查询?
问题描述
此查询需要从包含 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;
推荐阅读
- python - 如何使用 Stack Exchange API 获取给定评论 id 的问题标签?
- pandas - 如何使用熊猫加载文本文件?
- tensorflow - 为什么使用tensorflow做物体检测时Average Precision和Average Recall = -1?
- swift - SwiftUI 不正确的帧大小
- android - 有什么想法可以提高此自定义视图的渲染性能吗?
- python - 库贝特尔。服务中找不到环境变量
- heroku - Stripe 客户门户、后端服务器和移动设备
- powershell - 在 PowerShell 中对对象中的多个属性进行排序
- python - 处理 tictactoe 的异常情况
- docker - 找不到任何实现 Connector 且名称与 MySQL 匹配的类