MySQL DELETE是否对InnoDB表进行物理重新排序?

时间:2016-08-01 00:00:47

标签: mysql innodb

MySQL中的InnoDB表上的DELETE语句是否导致表被物理重新排序?我有一个巨大的(2亿)行表,我想从中删除某些记录。当我根据WHERE条件从中删除它需要90分钟,但只影响几十万行。

根据此stackoverflow答案,这是因为删除行会导致表在磁盘上进行物理重新排序: How can I improve DELETE FROM performance on large InnoDB tables?

我使用了他们提供的解决方案并且工作正常:创建一个新表并仅插入要保留的行,然后删除原始行。但! DBA在数据库副本上运行相同的直接DELETE,并在5分钟内完成。即使有缓存,我也很惊讶。

我无法从Oracle找到任何文档或以其他方式证明物理重新排序正在发生。有谁知道我在哪里可以找到说明这种情况的文件?或者某种方式来证明这是否是原因?

1 个答案:

答案 0 :(得分:2)

您是如何找到要删除的行的?有索引吗?如果您需要扫描整个表格, 需要花费200M行。

(假设InnoDB,......)

对于要删除的每一行,它都会执行以下操作:

  • 排队更改索引。
  • 生成撤消信息,稍后需要清除。
  • 从其所在的区块中删除记录。
  • 如果块变为​​“小”,则与相邻块合并。

其他评论:

  • 如果表大于buffer_pool,则可能会产生大量I / O.
  • 如果行是随机排列的,则可能有I / O来到达所需的行。
  • 如果密钥是UUID,则很可能需要I / O.
  • 如果撤消资料的数量“太大”,则该过程会因为必须更加努力地保存而减慢。

另一个方面 - 如果同时对表进行SELECTs,则会有一些交互减慢速度。

不,表格没有重建,只有很少的部分可能会重新排列。

可能的改进是遍历要删除的行,一次不超过1000。每个更改COMMIT,然后再转到下一个块。 More details, and more suggestions