MySQL批量删除大量数据

公司线上的 MySQL 数据库每半年都需要删除大量的无效数据,只保留部分数据,因为历史遗留问题有几个表需要清理二三亿条数据,少的也有几千万,任务非常艰巨。

以下是实现的几个思路:

delete

一般情况下删除数据是使用 delete,这个是最普遍但是也是效率最低的一个。
直接执行 DELETE FROM tb WHERE status=1 会发现删除失败,因为 lock wait timeout exceed 的错误
所涉及的记录数太多,因此我们通过 LIMIT 参数分批删除,比如每 10000 条进行一次删除,那么我们可以利用 MySQL 这样的语句来完成:

DELETE FROM tb WHERE status=1 LIMIT 10000;

这样的话需要分批次执行,大量的重复劳动,不推荐。

truncate

这个操作会把表中所有的数据给清除掉,清空数据的话效率不错。

由于需要保留部分数据,不适用。

表复制

Google 一下发现一个很好的方法:

1
2
3
4
5
6
7
8
# 把需要保留的数据转存到另外一张表中
INSERT INTO tb_copy SELECT * FROM tb WHERE ... ;

# 重命名两张表,间接实现删除数据操作
RENAME TABLE tb TO tb_old, tb_copy TO tb;

# 删除原来的表
DROP TABLE tb_old;