我一直在研究如何仅在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
对被标识为碎片(data_free > 0
)的InnoDB表之一运行了该命令,发现其data_free
之后没有改变。它仍然大于0。我还重新启动了MySQL,并检查了它以发现相同的结果。
现在,我们组织中有几台运行MySQL 5.5.29的服务器,我对所有服务器进行了查询,以识别出任何带有InnoDB表且未DATA_FREE=0 or NULL
返回任何表。它们都大于零。
我还OPTIMIZE
对一些大于零的MyISAM
表运行了该命令,DATA_FREE
然后验证它是否为零。
谁能为我阐明一下?从InnoDB表中删除碎片的正确方法是什么?确定零散的InnoDB表的正确方法是什么?
谢谢
innodb_file_per_table
它,共享表空间中的每个表也会显示相同的值。