我一直在研究如何仅优化 MySQL 中的碎片表,并查看了有关优化表的这篇文章。它基本上对包含任何表的 information_schema 数据库执行查询,data_free > 0
并OPTIMIZE
仅针对这些表构建 SQL 语句。我运行了这个查询,它确定了 148 个用于优化的表。所有标识的表都是 InnoDB 表。执行结果优化 SQL 脚本后,我重新运行原始脚本以识别碎片表,并在第一遍返回完全相同的表。
我看到过关于 InnoDB 表和OPTIMIZE
命令的相互冲突的帖子。有人说这OPTIMIZE
不适用于 InnoDB 表,您需要运行ALTER TABLE table_name ENGINE=INNODB
. 其他人说在对 InnoDB 表执行时OPTIMIZE
实际上调用了ALTER TABLE
命令。考虑到这一点,我ALTER TABLE
对标识为碎片化的 InnoDB 表之一运行了该命令 ( data_free > 0
),并发现该表data_free
之后没有更改。它仍然大于0。我也重新启动了MySQL并检查了它只是发现相同的结果。
现在,我们的组织中有几台运行 MySQL 5.5.29 的服务器,我对所有服务器进行了查询以识别任何 InnoDB 表,DATA_FREE=0 or NULL
但没有返回。它们都大于零。
我还OPTIMIZE
针对几个大于零的MyISAM
表运行了该命令,DATA_FREE
然后验证它是否为零。
任何人都可以为我解释一下吗?从 InnoDB 表中删除碎片的正确方法是什么?确定碎片化 InnoDB 表的正确方法是什么?
谢谢