如果有随机插入到表的索引或从表的索引随机删除,索引可能变成碎片的。碎片意思是索引页在磁盘上的物理排序并不接近页上记录的索引排序,或者在分配给索引的64页块上有许多没有被使用的页。
碎片的一个“同义词”是一个表占据的空间超过它应该占据的空间的大 小。确切是多少,这是很难去确定的。所有InnoDB数据和索引被存在B树中,并且它们的填充因子可能从50%到100%。碎片的另一个“同 义词”是一个表扫描例如:
SELECT COUNT(*) FROM t WHERE a_non_indexed_column <> 12345;
花了超过它应该花的时间。(在上面的查询中我们“欺骗”SQL优化器来扫描集束索引,而不是一个第二索引 )。多数磁盘可以读10MB/s到50MB/s,这可以被用来评估一个表扫描可以多快地运行。
如果你周期地执行“null” ALTER TABLE操作,它就可以加速索引扫描:
ALTER TABLE tbl_name ENGINE=INNODB
这导致MySQL重建表。另一个执行碎片整理操作的办法是使用mysqldump来转储一个表到一个文本文件,移除表,并重新从转储文件重装载它。
如果到一个索引的插入总是升序的,并且记录仅从末尾被删除,InnoDB文件空间管理保证在索引中的碎片不会发生。