MySQL 8.0 リファレンスマニュアル


15.11.4 テーブルのデフラグ

セカンダリインデックスへのランダムな挿入やセカンダリインデックスからのランダムな削除によって、インデックスが断片化される場合があります。 断片化とは、ディスク上のインデックスページの物理的な順序がページ上のレコードのインデックス順序とかけ離れているか、またはインデックスに割り当てられた 64 ページのブロック内に未使用のページが多数存在することを示します。

断片化の 1 つの現象として、あるテーブルが占めている領域が、本来占めているはずの領域より大きいことがあります。 それが正確にどの程度かを判定するのは困難です。 すべての InnoDB データおよびインデックスは B-trees に格納され、その fill factor は 50% から 100% まで異なる場合があります。 断片化の別の現象として、次のようなテーブルスキャンにかかる時間が、本来かかるはずの時間より長いことがあります。

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

前のクエリーでは、MySQL が、大きなテーブルに対してもっとも遅いタイプのクエリーであるフルテーブルスキャンを実行する必要があります。

インデックススキャンを高速化するために、MySQL にテーブルを再構築させる次のnull ALTER TABLE 操作を定期的に実行できます。

ALTER TABLE tbl_name ENGINE=INNODB

ALTER TABLE tbl_name FORCE を使用して、テーブルを再構築する null 変更操作を実行することもできます。

ALTER TABLE tbl_name ENGINE=INNODBALTER TABLE tbl_name FORCE はどちらも online DDL を使用します。 詳細は、セクション15.12「InnoDB とオンライン DDL」を参照してください。

デフラグ操作を実行するための別の方法として、mysqldump を使用してテーブルをテキストファイルにダンプし、テーブルを削除してから、それをダンプファイルからリロードする方法があります。

インデックスへの挿入が常に昇順であり、かつレコードが末尾からしか削除されない場合は、InnoDB のファイル領域管理アルゴリズムにより、インデックス内の断片化は発生しないことが保証されます。


関連キーワード:  InnoDB, テーブル, インデックス, 構成, 圧縮, スペース, ロック, INFORMATION, SCHEMA, 領域