首页 > 解决方案 > 删除范围内的十亿条记录与精确 ID 查找 MYSQL

问题描述

我有一个大约 700GB1 Billion行的数据库表,数据大约是 500GB,索引是 200GB,我正在尝试删除 2021 年之前的所有数据,大约298,970,576在 2021 年的行左右,还有708,337,583剩余的行。

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

DELETE FROM table_name WHERE id < 1762163840 LIMIT 1000000;

id -> 1762163840 代表 2021 年的数据。删除 1 百万行需要将近 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 个连接。

标签: mysqlsqlperformancesql-delete

解决方案


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

它指出这LIMIT 1000000是不必要的大,并导致比可能需要的更多锁定。

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

如果您使用 Gordon 的技术(根据需要重建表格),您将在很长一段时间内无法访问该表格;我提供了一个基本为零停机时间的替代方案。

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


推荐阅读