微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除范围内的十亿条记录与精确 ID 查找 MYSQL

如何解决删除范围内的十亿条记录与精确 ID 查找 MYSQL

我有一个大约 700GB 的数据库表,其中包含 1 Billion 行,数据大约为 500GB,索引为 200GB, 我正在尝试删除 2021 年之前的所有数据, 2021 年大约有 298,970,576 行,剩下 708,337,583 行。

删除这个,我在我的 python shell 中运行一个不间断的查询

DELETE FROM table_name WHERE id < 1762163840 LIMIT 1000000;

id -> 1762163840 表示 2021 年的数据。删除 100 万行大约需要 1200-1800 秒。

有什么办法可以加快这个速度,因为目前的方式已经运行了 15 天以上,到目前为止没有太多数据删除,而且它会做更多天。

我想,如果我制作一个表格,其中只包含我想删除的所有记录的 ID,然后做一个

这样的精确映射

DELETE FROM table_name WHERE id IN (SELECT id FROM _tmp_table_name);

那会很快吗?比先用所有记录创建一个新表然后删除它会更快吗?

数据库设置在 RDS 上,实例类为 db.r3.large 2 vcpu 和 15.25 GB RAM,仅运行 4-5 个连接。

解决方法

大删除的多种技术:http://mysql.rjweb.org/doc.php/deletebig

它指出 LIMIT 1000000 不必要地大并且导致比预期更多的锁定。

从长远来看,PARTITIONing 将是有益的,它提到了这一点。

如果你使用 Gordon 的技巧(用你需要的东西重建桌子),你会在很长一段时间内无法访问桌子;我提供了一种基本为零停机时间的替代方案。

id IN (SELECT...) 可能会非常慢——既是因为 in-SELECT 的效率低下,也是因为 DELETE 将挂在大量行上以保持事务完整性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。