Tag: 查询 性能

在MySQL中删除数百万行

我最近发现并修复了一个我正在处理的网站中的一个错误,这个错误导致了表中数百万重复的数据行,即使没有它们(仍然是数百万),这些数据行也相当大。 我可以很容易地find这些重复的行,并可以运行一个删除查询来杀死他们。 问题是试图一次性删除这么多行就locking了很长一段时间,如果可能,我想尽量避免。 我可以看到摆脱这些行的唯一途径,而不是取消网站(通过locking表): 编写一个脚本,在一个循环中执行数千个较小的删除查询。 这将理论上解决locking表问题,因为其他查询将能够进入队列并在删除之间运行。 但是它仍然会对数据库造成很大的负担,并且需要很长时间才能运行。 重命名表并重新创build现有的表(它现在将是空的)。 然后在重命名的表上进行清理。 重新命名新表,将旧名重新命名并将新行合并到已重命名的表中。 这是需要相当多的步骤,但应该完成的工作与最小的中断。 这里唯一棘手的部分就是所讨论的表格是一个报表,所以一旦它被重新命名,而空的表格被放置到位,那么所有的历史报告都会消失,直到我把它放回原处。 另外,由于存储数据的types,合并过程可能会有点痛苦。 总的来说,这是我现在可能的select。 我只是想知道是否有其他人之前有过这个问题,如果是的话,你怎么处理它,而不会取消网站,并希望尽可能减less,如果有任何中断用户? 如果我采用2号或者其他类似的方法,我可以把这些东西安排在深夜运行,并在第二天早些时候进行合并,让用户提前知道,这不是什么大问题。 我只是想看看有没有人有更好或更简单的方法来做清理的想法。