mysql - 我应该对 MySql InnoDB 表执行表优化吗?
问题描述
我有带有一些 InnoDB 表的 MySQL(实际上是 MariaDB)数据库。此类表中的记录永远不会删除,只会插入和更新。记录的数量已经相对较大——大约几百万。我相信,这些表自创建以来从未被优化过。
我应该优化这样的表吗?如何验证我是否应该优化这些表?
解决方案
不幸的是,几乎没有办法判断您是否需要优化 InnoDB 表。
当您删除或更新行时(我知道您说过您不删除),它可能会在旧版本的行所在的位置留下空白。优化一个表将所有行复制到一个新表中,没有间隙,因此它完成了“碎片整理”并且可能更紧凑地存储表。
您可以运行SHOW TABLE STATUS LIKE 'tablename'\G
并获取显示间隙大小的报告。它被报告data_free
为该状态结果中的列。但事情是这样的:data_free
只包括 1MB 或更大的间隙。较小的差距不计算在内,这些差距最终可能会导致很多碎片化。从字面上看,没有办法报告小差距的总数。
那么你应该优化这样的表吗?也许!这样做也不是坏事,比如一个月一次。
但是在优化时它不会锁定表并阻止查询吗?是的,有点。这就是为什么我使用pt-online-schema-change来运行无操作更改(使用--alter=force
选项),所以它可以随时完成,而不会阻塞客户端。
推荐阅读
- c++ - sizeof(struct name_of_struct) 与 sizeof(name_of_struct) 的区别?
- python - 如何在 python 中的现有文本文件中添加一列?
- php - 段落中第一句的 Xpath 表达式
- rest - 我如何将 curl 转换为 powershell
- python - 如何使用 pandas 在 python 中重塑 csv 文件?
- php - pChart 中的横坐标点放置 - 值,而不是标签
- python - How can I fix AttributeError in Manim Hello World program?
- python - PyMongo - 聚合不适用于组
- c# - 当我将数组传递给方法并对其重新排序时,它也会在方法之外对其进行重新排序
- javascript - 如何在 JSF 中的 Bean 中添加 Faces-redirect 后要执行的 JavaScript 函数?