InnoDB
では、インデックスの作成または再構築時に、インデックスレコードを一度に挿入するかわりにバルクロードが実行されます。 このインデックス作成方法は、ソートされたインデックス作成とも呼ばれます。 ソートされたインデックス構築は、空間インデックスではサポートされていません。
インデックス作成には 3 つのフェーズがあります。 最初のフェーズでは、clustered index がスキャンされ、インデックスエントリが生成されてソートバッファに追加されます。 sort buffer がいっぱいになると、エントリはソートされ、一時中間ファイルに書き込まれます。 このプロセスは、「run」 とも呼ばれます。 2 番目のフェーズでは、1 つ以上の実行が一時中間ファイルに書き込まれ、ファイル内のすべてのエントリに対してマージソートが実行されます。 3 番目と最後のフェーズでは、ソートされたエントリが B-tree に挿入されます。
ソートされたインデックス構築が導入される前に、インデックスエントリは挿入 API を使用して一度に 1 つのレコードを B ツリーに挿入されました。 この方法では、B ツリー cursor を開いて挿入位置を検索し、optimistic 挿入を使用して B ツリーページにエントリを挿入します。 ページがいっぱいであるために挿入が失敗した場合は、pessimistic 挿入が実行されます。これには、B ツリーカーソルをオープンし、必要に応じて B ツリーノードを分割してマージし、エントリの領域を見つけます。 インデックスを作成するこの 「top-down」 メソッドの欠点は、挿入位置の検索と、B ツリーノードの一定の分割およびマージのコストです。
ソートされたインデックス構築では、「bottom-up」 アプローチを使用してインデックスを構築します。 このアプローチでは、B ツリーのすべてのレベルで右端のリーフページへの参照が保持されます。 必要な B ツリー深度の右端のリーフページが割り当てられ、ソート順に従ってエントリが挿入されます。 リーフページがいっぱいになると、ノードポインタが親ページに追加され、兄弟リーフページが次の挿入用に割り当てられます。 このプロセスは、すべてのエントリが挿入されるまで続行され、ルートレベルまで挿入される可能性があります。 兄弟ページが割り当てられると、以前に固定されたリーフページへの参照が解放され、新しく割り当てられたリーフページが最も右側のリーフページおよび新しいデフォルトの挿入場所になります。
将来のインデックス増加のための B ツリーページ領域の予約
将来のインデックス増加のために領域を確保するには、innodb_fill_factor
構成オプションを使用して、B ツリーページ領域の割合を確保します。 たとえば、innodb_fill_factor
を 80 に設定すると、ソートされたインデックスの作成時に B ツリーページの領域の 20% が予約されます。 この設定は、B ツリーリーフページと非リーフページの両方に適用されます。 TEXT
または BLOB
エントリに使用される外部ページには適用されません。 予約される領域の量は、innodb_fill_factor
値が強い制限ではなくヒントとして解釈されるため、正確には構成されていない場合があります。
ソートされたインデックス構築および全文インデックスのサポート
ソートされたインデックス構築は、fulltext indexes でサポートされています。 以前は、SQL を使用して全文インデックスにエントリが挿入されていました。
ソートされたインデックス作成および圧縮されたテーブル
compressed tables の場合、以前のインデックス作成方法では、圧縮ページと非圧縮ページの両方にエントリが追加されました。 変更ログ (圧縮されたページの空き領域を表す) がいっぱいになると、圧縮されたページが再圧縮されます。 領域不足のために圧縮に失敗した場合、ページは分割されます。 ソートされたインデックス構築では、エントリは圧縮されていないページにのみ追加されます。 圧縮されていないページがいっぱいになると、圧縮されます。 適応パディングは、ほとんどの場合に圧縮が成功するようにするために使用されますが、圧縮が失敗した場合は、ページが分割され、圧縮が再試行されます。 このプロセスは、圧縮が成功するまで続行されます。 B ツリーページの圧縮の詳細は、セクション15.9.1.5「InnoDB テーブルでの圧縮の動作」 を参照してください。
ソートされたインデックスの作成および redo ロギング
Redo logging は、ソートされたインデックスの作成中は無効になります。 かわりに、インデックス作成が予期しない終了または障害に耐えることができるようにする checkpoint があります。 チェックポイントにより、すべてのダーティページが強制的にディスクに書き込まれます。 ソートされたインデックスの作成中に、チェックポイント操作を迅速に処理できるように、dirty pages をフラッシュするように page cleaner スレッドに定期的にシグナルが送信されます。 通常、クリーンページ数が設定されたしきい値を下回ると、ページクリーナスレッドはダーティページをフラッシュします。 ソートされたインデックス構築の場合、ダーティページはチェックポイントのオーバーヘッドを削減し、I/O および CPU アクティビティをパラレル化するためにすぐにフラッシュされます。
ソートされたインデックス構築およびオプティマイザ統計
ソートされたインデックス構築では、optimizer 統計が、前述のインデックス作成方法で生成された統計と異なる場合があります。 ワークロードのパフォーマンスに影響しない統計の違いは、インデックスの移入に使用されるアルゴリズムが異なることが原因です。