小编典典

在MySQL中删除数百万行

mysql

我最近发现并修复了我正在处理的站点中的错误,该错误导致表中有数百万行重复的数据行,即使没有行也将非常大(仍然有数百万行)。我可以轻松找到这些重复的行,并可以运行一个删除查询来杀死它们。问题是试图一次删除这么多行会长时间锁定表,如果可能的话,我想避免这种情况。我可以看到摆脱这些行而又不占用站点(通过锁定表)的唯一方法是:

  1. 编写一个脚本,该脚本将循环执行数千个较小的删除查询。从理论上讲,这将解决锁定表的问题,因为其他查询将能够使其进入队列并在删除之间运行。但是它仍然会在一定程度上增加数据库的负载,并且需要很长时间才能运行。
  2. 重命名表并重新创建现有表(该表现在为空)。然后在重命名的表上进行清理。重命名新表,重命名旧表,然后将新行合并到重命名表中。这种方法需要花费更多的步骤,但是应该以最小的中断来完成工作。这里唯一棘手的部分是,有问题的表格是报表表格,因此,一旦将其重命名并放了空表格,所有历史报表都将消失,直到我将其放回原处。另外,由于要存储的数据类型,合并过程可能会有些麻烦。总的来说,这是我现在可能的选择。

我只是想知道以前是否有人遇到过这个问题,如果是的话,您如何在不关闭站点的情况下进行处理,希望对用户的干扰最小(如果有的话)?如果我使用2号或其他类似的方法,我可以将这些内容安排在深夜运行,并在第二天清晨进行合并,只需要提前通知用户即可,所以这不是什么大问题。我只是想看看是否有人对更好或更轻松的清理方式有任何想法。


阅读 419

收藏
2020-05-17

共1个答案

小编典典

DELETE FROM `table`
WHERE (whatever criteria)
ORDER BY `id`
LIMIT 1000

洗涤,漂洗,重复直到零行受到影响。也许在脚本之间,在两次迭代之间hibernate一到两秒。

2020-05-17