データベースアプリケーションでは、主キーが固有の識別子であり、新しい行が主キーの昇順で挿入されることが一般的です。したがって、クラスタインデックスへの挿入では、ディスクからのランダムな読み取りを必要としません。
一方、二次インデックスは通常一意ではなく、二次インデックスへの挿入は比較的ランダムな順番で行われます。このため、InnoDB
で特別な構造が使用されることなく、多数のランダムなディスク
I/O が発生します。
一意でない二次インデックスにインデックスレコードが挿入される場合は、二次インデックスページがすでにバッファープール内にあるかどうかが
InnoDB
によって確認されます。すでにある場合は、InnoDB
によってインデックスページに直接レコードが挿入されます。バッファープール内にインデックスページがなかった場合は、InnoDB
によって特別な挿入バッファー構造にレコードが挿入されます。挿入バッファーは、その全体がバッファープール内に収まるように小さくしてあるため、このバッファーへの挿入はきわめて高速です。
挿入バッファーは、データベース内の二次インデックスツリーに定期的にマージされます。インデックスツリーの同じページ内に複数の挿入をマージすることで、ディスク I/O を削減できます。挿入バッファーによってテーブルへの挿入速度が最大 15 倍に高められることが測定されています。
挿入バッファーマージは、挿入トランザクションがコミットされた
後
まで発生し続けるでしょう。実際、これはサーバーがシャットダウンし、再起動する後まで発生し続けます
(項9.6.2. 「InnoDB
復旧の強制」を参照)。
挿入バッファーマージは、多くの二次インデックスが更新される必要があり、多くの行が挿入されたときに、何時間もかかる可能性があります。この間はディスク
I/O
が増加してしまいます。それにより、ディスク操作をたくさん行うようなクエリーはスローダウンしてしまいます。このほかの主なバックグラウンド
I/O スレッドは、パージスレッドです
(項9.9. 「InnoDB
マルチバージョン管理」を参照)。