セカンダリインデックスへのランダムな挿入やセカンダリインデックスからのランダムな削除によって、インデックスが断片化される場合があります。 断片化とは、ディスク上のインデックスページの物理的な順序がページ上のレコードのインデックス順序とかけ離れているか、またはインデックスに割り当てられた 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
を使用して、テーブルを再構築する 「null」 変更操作を実行することもできます。
tbl_name
FORCE
ALTER TABLE
と tbl_name
ENGINE=INNODBALTER TABLE
はどちらも online DDL を使用します。 詳細は、セクション15.12「InnoDB とオンライン DDL」を参照してください。
tbl_name
FORCE
デフラグ操作を実行するための別の方法として、mysqldump を使用してテーブルをテキストファイルにダンプし、テーブルを削除してから、それをダンプファイルからリロードする方法があります。
インデックスへの挿入が常に昇順であり、かつレコードが末尾からしか削除されない場合は、InnoDB
のファイル領域管理アルゴリズムにより、インデックス内の断片化は発生しないことが保証されます。