我们正在运行 OPTIMIZE TABLE ,但没有看到任何碎片减少。它们高达 120% 到 200%。
使用以下公式计算碎片率:Data_Free / (Data_Length + Index_Length)
我的表使用 INNODB 引擎并且“innodb_file_per_table”设置为 1。
我错过了什么?
Mysql 5.5+ 以后版本有什么变化吗?
短暂性脑缺血发作
答案1
“OPTIMIZE TABLE”仅适用于 MyISAM 表 - InnoDB 不会像 MyISAM 表那样受到“碎片”的影响。因此,您不需要优化它们。
此外,您的计算方法不正确。因为除了数据+索引长度之外,还有更多事情要做。
答案2
ALTER TABLE table_name ENGINE=InnoDB; 可用于 InnoDB 表来重建表、清理其索引,并且在使用 innodb_file_per_table=1 的情况下调整表文件的大小。
除此之外,innodb 会自行处理,运行此命令后可能遇到的任何减速都是因为您重建了在主键上索引的表,并且如果在数据库查找中更频繁地使用辅助键,那么您反而会将它们碎片化。
InnoDB 倾向于了解数据的稀疏文件存储,并且可能需要比某些人对它造成的损害更少地进行“修复”。