MySQL DELETE是否会物理上对InnoDB表重新排序?

AS7K

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

根据这个stackoverflow的答案,这是因为删除行会导致表在磁盘上进行物理重新排序:如何提高大型InnoDB表的DELETE FROM性能?

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

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

里克·詹姆斯

您如何找到要删除的行?有索引吗?如果您需要扫描整个表,那么200M行需要很多时间。

(假设是InnoDB,...)

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

  • 将对索引的更改排队。
  • 生成撤消信息,以后需要清除。
  • 从记录所在的块中删除记录。
  • 如果一个块变小,则与相邻的块合并。

其他的建议:

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

另一个方面-如果同时存在SELECTs针对表的问题,则存在一些交互作用,这会使事情变慢。

不,桌子没有重建,只有很少的零件可以重新布置。

可能的改进是遍历要删除的行,一次不超过1000。COMMIT每次更改之前,请先进行下一个更改。更多详细信息和更多建议

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我是否必须删除主键或重新加载表数据以在MySQL InnoDB中进行分区?

来自分类Dev

我是否必须删除主键或重新加载表数据以在MySQL InnoDB中进行分区?

来自分类Dev

是否可以删除mysql表排序规则?

来自分类Dev

是否可以删除mysql表排序规则?

来自分类Dev

MySQL Innodb“表已满”错误

来自分类Dev

如何对MySQL表中的记录/行进行重新排序

来自分类Dev

重新排序mysql表行以提高速度

来自分类Dev

MySQL InnoDB慢-按情况排序

来自分类Dev

是否可以通过A减B索引mysql表以进行排序?

来自分类Dev

聊天表的mysql引擎(堆/内存与innodb)

来自分类Dev

MySQL InnoDB丢失表但文件存在

来自分类Dev

找出什么锁定了MySQL InnoDB表行

来自分类Dev

如何更改mysql表的物理顺序?

来自分类Dev

检查innodb_file_per_table是否在每个表的MYSQL 5.5中设置的任何方法?

来自分类Dev

如何在MySQL表中处理上周的游戏成绩

来自分类Dev

MySQL选择表是否存在

来自分类Dev

mysql插入表是否存在

来自分类Dev

MySQL是否支持表继承?

来自分类Dev

MySql:是否可以嵌套表?

来自分类Dev

InnoDB上的MySQL UPDATE操作偶尔会超时

来自分类Dev

在MySQL中使用“ TYPE = InnoDB”会引发异常

来自分类Dev

InnoDB的MySQL死锁问题

来自分类Dev

MySQL查询性能(InnoDB)

来自分类Dev

MySQL的InnoDB插入失败

来自分类Dev

MySQL MVCC(InnoDB)

来自分类Dev

MySQL InnoDB 并发更新

来自分类Dev

XAMPP MySQL InnoDB 错误

来自分类Dev

MySQL 5.6.10 InnoDB无法创建表,因为表已存在

来自分类Dev

MySQL从Memory表中删除加入InnoDB表