MySQL的InnoDB表上的DELETE语句是否导致表在物理上重新排序?我有一个巨大的(2亿)行表,我想从中删除某些记录。当我基于WHERE条件从中删除时,大约需要90分钟,但只会影响数十万行。
根据这个stackoverflow的答案,这是因为删除行会导致表在磁盘上进行物理重新排序:如何提高大型InnoDB表的DELETE FROM性能?
我使用了他们提供的解决方案,它起作用了:创建一个新表并仅插入要保留的行,然后删除原始行。但!DBA在数据库副本上运行了相同的直接DELETE,并且在5分钟内即可正常工作。即使有了缓存,我也很惊讶。
我找不到来自Oracle的任何文档,否则无法证明物理重新排序正在发生。有谁知道我可以在哪里找到说明这种情况的文档?或某种方式证明这是原因吗?
您如何找到要删除的行?有索引吗?如果您需要扫描整个表,那么200M行需要很多时间。
(假设是InnoDB,...)
对于要删除的每一行,它们执行以下操作:
其他的建议:
另一个方面-如果同时存在SELECTs
针对表的问题,则存在一些交互作用,这会使事情变慢。
不,桌子没有重建,只有很少的零件可以重新布置。
可能的改进是遍历要删除的行,一次不超过1000。COMMIT
每次更改之前,请先进行下一个更改。更多详细信息和更多建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句