カバリングインデックス
カバリングインデックスとは、クエリで参照する全カラムをインデックス側だけで賄えるように設計したもので、テーブル本体アクセス(インデックスオンリースキャン)を不要にする。
「テーブル本体を読まない」インデックス
通常のインデックス検索は、インデックスで該当行を特定してからテーブル本体にアクセスして必要なカラムを取り出します。 カバリングインデックスは、必要なカラムをインデックス側に全部含めることで、テーブル本体アクセスを一切不要にします。
(user_id, order_id)※ ここでは分かりやすさのためソート済みリスト風に描いているが、 実際はB-treeで保持されるので探索は O(log N)。 詳しくは B-treeの仕組み へ。
amount を取得するために、インデックスで見つけた各行についてテーブル本体を追加アクセスする(Row Lookup)。
SELECT amount FROM orders WHERE user_id = 1 を想定。カバリングにすると amount がインデックスに含まれるためテーブル本体を読む必要が無くなる。省略されているのは「テーブル本体のページ読み取り」
通常のインデックスは、葉ノードから 行ID を取得したあと、そのIDが指すページを読みに行きます。この追加のページI/Oが、行数が多いクエリでは支配的な時間になる。
カバリングにすると、必要な値がインデックス側に入っているため、この「テーブル本体のページを読む」ステップを完全に省略できます。
「インデックスオンリースキャン」と呼ばれる
実行計画(EXPLAIN)に「テーブル本体を触っていない」ことを示す文言が現れるのがこのケース(RDBMSごとに用語は異なる)。 テーブルアクセスが省かれるため、行数が多いクエリで劇的に速くなります。
設計のポイント
- クエリで参照するカラムだけを覆えばよい。
SELECT *ではなく必要な列だけを取る - ソートや集約に使うカラムを含めておくと、そのままインデックスから結果が返せる
- 大きなカラムを覆うとインデックスが膨らむので費用対効果を確認する
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。