Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

17.11.4 表的碎片整理

在辅助索引中随机插入或删除记录可能会导致索引碎片化。碎片化意味着索引页在磁盘上的物理顺序与记录在页上的顺序不一致,或者在分配给索引的64页块中有许多未使用的页。

碎片化的一个症状是表占用的空间超过它 应该 占用的空间。确切地说,这很难确定。所有 InnoDB 数据和索引都存储在 B树 中,它们的 填充因子 可以从 50% 到 100% 不等。另一个碎片化的症状是表扫描查询花费的时间超过它 应该 花费的时间:

SELECT COUNT(*) FROM t WHERE non_indexed_column <> 12345;

前面的查询需要 MySQL 执行完整的表扫描,这是大表中最慢的查询类型。

为了加速索引扫描,可以定期执行 ALTER TABLE 操作,从而重建表:

ALTER TABLE tbl_name ENGINE=INNODB

您也可以使用 ALTER TABLE tbl_name FORCE 执行“空”alter 操作以重建表。

both ALTER TABLE tbl_name ENGINE=INNODBALTER TABLE tbl_name FORCE 使用 在线 DDL。有关更多信息,请参阅 第 17.12 节,“InnoDB 和在线 DDL”

另一种执行碎片整理操作的方法是使用 mysqldump 将表转储到文本文件中,删除表,然后从转储文件中重新加载。

如果索引中的插入总是递增的,并且记录只从末尾删除,那么 InnoDB 文件空间管理算法保证索引中不会出现碎片化。