MySQL中的InnoDB表上的DELETE语句是否导致表被物理重新排序?我有一个巨大的(2亿)行表,我想从中删除某些记录。当我根据WHERE条件从中删除它需要90分钟,但只影响几十万行。
根据此stackoverflow答案,这是因为删除行会导致表在磁盘上进行物理重新排序: How can I improve DELETE FROM performance on large InnoDB tables?
我使用了他们提供的解决方案并且工作正常:创建一个新表并仅插入要保留的行,然后删除原始行。但! DBA在数据库副本上运行相同的直接DELETE,并在5分钟内完成。即使有缓存,我也很惊讶。
我无法从Oracle找到任何文档或以其他方式证明物理重新排序正在发生。有谁知道我在哪里可以找到说明这种情况的文件?或者某种方式来证明这是否是原因?
答案 0 :(得分:2)
您是如何找到要删除的行的?有索引吗?如果您需要扫描整个表格, 需要花费200M行。
(假设InnoDB,......)
对于要删除的每一行,它都会执行以下操作:
其他评论:
另一个方面 - 如果同时对表进行SELECTs
,则会有一些交互减慢速度。
不,表格没有重建,只有很少的部分可能会重新排列。
可能的改进是遍历要删除的行,一次不超过1000。每个更改COMMIT
,然后再转到下一个块。 More details, and more suggestions