【发布时间】:2010-11-22 01:59:25
【问题描述】:
我最近在我正在处理的网站中发现并修复了一个错误,该错误导致表中存在数百万行重复的数据,即使没有它们也会非常大(仍然是数百万行)。我可以很容易地找到这些重复的行,并且可以运行一个删除查询来将它们全部杀死。问题是尝试一次删除这么多行会长时间锁定表,如果可能的话,我想避免这种情况。在不关闭网站(通过锁定表格)的情况下,我可以看到摆脱这些行的唯一方法是:
- 编写一个循环执行数千个较小的删除查询的脚本。从理论上讲,这将解决锁定表问题,因为其他查询将能够使其进入队列并在删除之间运行。但它仍然会大大增加数据库的负载,并且需要很长时间才能运行。
- 重命名表并重新创建现有表(它现在为空)。然后对重命名的表进行清理。重命名新表,重新命名旧表并将新行合并到重命名的表中。这种方式需要更多的步骤,但应该以最小的中断完成工作。这里唯一棘手的部分是有问题的表格是一个报告表,所以一旦它被重命名并且空的那个放在它的位置,所有历史报告都会消失,直到我把它放回原位。另外,由于存储的数据类型,合并过程可能会有点麻烦。总的来说,这是我现在可能的选择。
我只是想知道以前是否有其他人遇到过这个问题,如果有,您是如何在不关闭网站的情况下处理它的,并且希望对用户的干扰最小化?如果我采用 2 号或其他类似的方法,我可以安排这些东西在深夜运行,并在第二天一大早进行合并,并提前让用户知道,所以这不是什么大不了的事。我只是想看看是否有人对更好或更简单的清理方法有任何想法。
【问题讨论】:
-
最近通过存储过程在不到一个小时的时间内删除了生产系统中大约7000万条记录,查看这个页面,它可能对其他人也有帮助rathishkumar.in/2017/12/…
-
在下面查看我的答案,我解释了为什么在 MySQL 中反向删除比正向删除快多个数量级。在您阅读我的解释之前,这听起来很不直观。
标签: mysql query-performance maintenance sql-delete