首页 > 解决方案 > 我应该对 MySql InnoDB 表执行表优化吗?

问题描述

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

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

标签: mysqloptimizationmariadb

解决方案


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

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

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

那么你应该优化这样的表吗?也许!这样做也不是坏事,比如一个月一次。

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


推荐阅读