【问题标题】:Should I perform table optimization on MySql InnoDB tables?我应该对 MySql InnoDB 表执行表优化吗?
【发布时间】:2021-08-13 20:33:04
【问题描述】:

我有带有一些 InnoDB 表的 MySQL(实际上是 MariaDB)数据库。 此类表中的记录永远不会删除,只会插入和更新。 记录的数量已经相对较大——大约几百万。 我相信,这些表自创建以来从未被优化过。

我应该优化这些表吗? 如何验证我是否应该优化这些表?

【问题讨论】:

  • 简单的经验法则:永远不要在 InnoDB 表上使用 OPTIMIZE TABLE
  • 为什么?下面的比尔卡尔文提出了相反的建议,他解释了为什么......似乎有一些相互矛盾的观点,这就是我问的原因......
  • Bill 正在解决您的陈述问题——“我什么时候应该优化?”。我正在解决隐含的问题——“我应该优化吗?”。我同意当你做一个大的DELETEOPTIMIZE可能是可取的。但是,对于“大删除”,可能有一种方法可以避免碎片。 (这是一个很长的讨论,我在其他问题中已经解决了。)

标签: mysql optimization mariadb


【解决方案1】:

不幸的是,几乎没有办法判断您是否需要优化 InnoDB 表。

当您删除或更新行时(我知道您说过您不会删除),它可能会在旧版本的行所在的位置留下空白。优化一个表将所有行复制到一个新表中,没有间隙,因此它完成了“碎片整理”并且可能更紧凑地存储表。

您可以运行SHOW TABLE STATUS LIKE 'tablename'\G 并获得一份显示差距大小的报告。它在该状态结果中报告为data_free 列。但事情是这样的:data_free 只包括 1MB 或更大的间隙。较小的差距不计算在内,这些差距最终可能会导致很多碎片化。实际上没有办法报告小差距的总数。

那么你应该优化这样的表吗?可能是!这样做也不错,一个月一次吧。

但是在优化时它不会锁定表并阻止查询吗?是的,有点。这就是为什么我使用pt-online-schema-change 来运行无操作更改(使用--alter=force 选项),所以它可以随时完成,而不会阻塞客户端。

【讨论】:

  • 感谢您的解释。我首先尝试在一些较小的测试表上玩,我看到 data_free 仍然是 4194304,即使在该表上运行优化后也是如此。这正常吗?
  • 是的,可能。当表空间增长时,它们一次增加 4MB。见dev.mysql.com/doc/refman/5.7/en/innodb-file-space.html当你插入新的数据行时,这4MB将被填充,然后在需要时再次扩展表空间。
  • @SergeS - InnoDB 为每个表保留 4M 到 7M 的预分配空间。 (或表的每个分区!)您无法“消除”Data_free。该文件还有 许多 部分“免费”但未提及或统计。
猜你喜欢
  • 2013-06-02
  • 2011-02-18
  • 2011-07-17
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2010-10-13
  • 2016-11-12
相关资源
最近更新 更多