mysql - 删除范围内的十亿条记录与精确 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 个连接。
解决方案
大删除的多种技术:http: //mysql.rjweb.org/doc.php/deletebig
它指出这LIMIT 1000000
是不必要的大,并导致比可能需要的更多锁定。
从长远来看,PARTITIONing
这将是有益的,它提到了这一点。
如果您使用 Gordon 的技术(根据需要重建表格),您将在很长一段时间内无法访问该表格;我提供了一个基本为零停机时间的替代方案。
id IN (SELECT...)
可能非常慢——既是因为 in-SELECT 的效率低下,也是因为 DELETE 将保留大量行以实现事务完整性。
推荐阅读
- javascript - 背景属性的转换问题
- excel - 基于活动行值突出显示单元格
- ruby-on-rails - Ruby on Rails:使用范围验证两个包含条件
- sql - 如何在 SQL BigQuery 中将每个单词分配给多个日期
- r - kmeans 的 ggplotting 聚类和地图坐标
- asp.net - ASP.NET Core MVC - NETSDK1018 Invalid Nuget 版本字符串'Win10 - 1709 - Build - 1.5.3' - Windows 10 升级后
- c - C函数输入字符串和计算
- node.js - Node.js 捕获导致 uncaughtException/unhandledRejection 的请求?
- c# - C# LINQ Group By 并在该组上运行方法
- python - 安装旧版本的 scikit-learn