MySQL DELETE 是否在物理上重新排序 InnoDB table?
Does a MySQL DELETE physically reorder an InnoDB table?
MySQL 中 InnoDB table 上的 DELETE 语句是否会导致 table 被物理重新排序?我有一个巨大的(2 亿)行 table,我想从中删除某些记录。当我根据 WHERE 条件从中删除时,大约需要 90 分钟,但只影响几十万行。
根据这个 Whosebug 答案,这是因为删除行会导致 table 在磁盘上进行物理重新排序:
How can I improve DELETE FROM performance on large InnoDB tables?
我使用了他们提供的解决方案并且有效:制作一个新的 table 并仅插入您想要保留的行,然后删除原始行。但! DBA 运行 在数据库副本上执行相同的直接 DELETE,它在 5 分钟内完成。即使有缓存我也很惊讶。
我找不到来自 Oracle 的任何文档或以其他方式证明正在发生物理重新排序。有谁知道我在哪里可以找到说明这种情况的文档?或者有什么方法可以证明这是否是原因?
您是如何找到要删除的行的?有索引吗?如果您需要扫描整个 table,那 需要很多 200M 行。
(假设 InnoDB,...)
对于要删除的每一行,它会执行以下操作:
- 排队对索引的更改。
- 生成撤消信息,稍后需要清除。
- 从记录所在的块中删除记录。
- 如果一个块变成 'small',则与相邻的块合并。
其他评论:
- 如果 table 比 buffer_pool 大,您可能会招致很多 I/O。
- 如果行是随机排列的,可能会有 I/O 到所需的行。
- 如果密钥是一个UUID,你很可能需要I/O。
- 如果撤消的东西的数量是 'too big',过程会变慢,因为必须更加努力地工作才能保存它。
另一个方面 -- 如果同时有 SELECTs
反对 table,则有一些互动会减慢速度。
不,table没有重建,只有很少的部分可能会重新排列。
一个可能的改进是遍历要删除的行,一次不超过 1000 个。 COMMIT
在移动到下一个块之前的每个更改。 More details, and more suggestions.
MySQL 中 InnoDB table 上的 DELETE 语句是否会导致 table 被物理重新排序?我有一个巨大的(2 亿)行 table,我想从中删除某些记录。当我根据 WHERE 条件从中删除时,大约需要 90 分钟,但只影响几十万行。
根据这个 Whosebug 答案,这是因为删除行会导致 table 在磁盘上进行物理重新排序: How can I improve DELETE FROM performance on large InnoDB tables?
我使用了他们提供的解决方案并且有效:制作一个新的 table 并仅插入您想要保留的行,然后删除原始行。但! DBA 运行 在数据库副本上执行相同的直接 DELETE,它在 5 分钟内完成。即使有缓存我也很惊讶。
我找不到来自 Oracle 的任何文档或以其他方式证明正在发生物理重新排序。有谁知道我在哪里可以找到说明这种情况的文档?或者有什么方法可以证明这是否是原因?
您是如何找到要删除的行的?有索引吗?如果您需要扫描整个 table,那 需要很多 200M 行。
(假设 InnoDB,...)
对于要删除的每一行,它会执行以下操作:
- 排队对索引的更改。
- 生成撤消信息,稍后需要清除。
- 从记录所在的块中删除记录。
- 如果一个块变成 'small',则与相邻的块合并。
其他评论:
- 如果 table 比 buffer_pool 大,您可能会招致很多 I/O。
- 如果行是随机排列的,可能会有 I/O 到所需的行。
- 如果密钥是一个UUID,你很可能需要I/O。
- 如果撤消的东西的数量是 'too big',过程会变慢,因为必须更加努力地工作才能保存它。
另一个方面 -- 如果同时有 SELECTs
反对 table,则有一些互动会减慢速度。
不,table没有重建,只有很少的部分可能会重新排列。
一个可能的改进是遍历要删除的行,一次不超过 1000 个。 COMMIT
在移动到下一个块之前的每个更改。 More details, and more suggestions.