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 | # 把需要保留的数据转存到另外一张表中 |