我有一些包含数百万行(最多 6MLN)的表,我需要执行删除以减少行数。我创建了一个带有循环的过程,每次执行删除 10k 记录。
我所看到的是,在一些执行之后,表开始响应非常慢并且删除不再响应,例如:
- 第一次迭代,要删除 30k 条记录,时间 35 秒
- 第二次迭代,要删除 126k 条记录,时间 3.4 分钟
- 第三次迭代,要删除 35 万条记录,时间 24 分钟
每次迭代我都会每 10k 记录提交一次。所以第一次迭代需要删除 30k 记录并提交每 10k 记录。
我看到每次执行该程序时,表都会增长(并且不会减少,这是我所期待的......)
我试图在这篇文章之前找到一个好的解决方案,但没有运气。
我无法删除并重新创建记录较少的表,因此我需要找到一种方法来降低表上的记录。
我怎样才能删除所有这些保持性能的记录?可用空间、“精心构建的索引”等
如果需要,我可以给你更多细节
对于“大”删除(例如,超过一半的表),请执行以下操作:
INSERT..SELECT
速度很慢;其他步骤很快。除非原始表是用创建的,否则不需要“收缩”innodb_file_per_table=OFF
,在这种情况下,磁盘使用量会随着这个过程而增加。更多案例的更多大删除提示:http: //mysql.rjweb.org/doc.php/deletebig