对表进行碎片整理
随机插入二级索引或从二级索引中删除可能导致索引碎片化。碎片意味着磁盘上索引页的物理排序与页上记录的索引排序不接近,或者64页块中有许多未使用的页已分配给索引。
碎片的一个症状是表占用的空间超过了它应“占用”的空间。到底有多少是很难确定的。所有InnoDB
数据和索引都存储在B树中,它们的填充因子可能在50%到100%之间变化。碎片化的另一个症状是,这样的表扫描花费的时间比“应该”花费的时间更多:
SELECT COUNT(*)FROM tWHERE non_indexed_column <> 12345;
前面的查询要求MySQL执行全表扫描,这是大型表的最慢查询类型。
为了加快索引扫描,您可以定期执行“ null ”ALTER TABLE
操作,这会导致MySQL重建表:
ALTER TABLE tbl_nameENGINE =INNODB
您还可以用来执行“ null ”更改操作以重建表。ALTER TABLE tbl_name FORCE
双方并使用在线DDL。有关更多信息,请参见“ InnoDB和在线DDL”。ALTER TABLE tbl_name ENGINE=INNODB
ALTER TABLE tbl_name FORCE
执行碎片整理操作的另一种方法是使用mysqldump将表转储到文本文件,删除表并从转储文件重新加载它。
如果对索引的插入总是递增的,并且记录仅从末尾删除,则InnoDB
文件空间管理算法可确保不会发生索引中的碎片。