MySQL 8.4 版本注意事項
隨機插入或刪除次要索引可能會導致索引變得破碎。碎片表示磁碟上索引頁面的實體順序與頁面上記錄的索引順序不接近,或者在分配給索引的 64 頁區塊中有許多未使用的頁面。
碎片的一個症狀是表格佔用的空間比它「應該」佔用的空間還多。確切的數量很難確定。所有 InnoDB
資料和索引都儲存在 B 樹中,它們的填滿因數可能從 50% 到 100% 不等。碎片的另一個症狀是表格掃描(例如此掃描)所花費的時間比它「應該」花費的時間還多。
SELECT COUNT(*) FROM t WHERE non_indexed_column <> 12345;
先前的查詢需要 MySQL 執行完整表格掃描,這是大型表格最慢的查詢類型。
若要加快索引掃描速度,您可以定期執行「空」ALTER TABLE
操作,這會導致 MySQL 重建表格
ALTER TABLE tbl_name ENGINE=INNODB
您也可以使用 ALTER TABLE
來執行重建表格的「空」變更操作。tbl_name
FORCE
使用 ALTER TABLE
和 tbl_name
ENGINE=INNODBALTER TABLE
都會使用線上 DDL。 更多資訊請參閱 第 17.12 節,「InnoDB 和線上 DDL」。tbl_name
FORCE
另一種執行碎片整理操作的方法是使用 mysqldump 將表格傾印到文字檔案,刪除表格,然後從傾印檔案重新載入。
如果索引的插入始終是遞增的,並且記錄僅從末尾刪除,則 InnoDB
檔案空間管理演算法保證索引中不會發生碎片。