複合インデックス
複合インデックス(マルチカラムインデックス)とは、2つ以上のカラムを組み合わせて1つのインデックスとして構築したもので、先頭カラム側の条件から順に効く。
複合インデックスは「辞書順」で並ぶ
複合インデックス (A, B) は、まずAで並び替え、A内でBの順に並びます。 辞書の「アイウエオ」で1文字目→2文字目の順に並ぶのと同じです。 だから先頭カラムAが条件に無いとインデックスをたどれず、Bだけで絞り込むことはできません。
-- インデックス定義 CREATE INDEX idx_last_first ON people (last, first); -- 検索クエリ SELECT * FROM people WHERE last = 'Sato';
先頭カラム last で絞り込むので、辞書の「さ」行を探すのと同じ。連続した範囲だけを読む。
(last, first)※ ここでは分かりやすさのためソート済みリスト風に描いているが、 実際はB-treeで保持されるので探索は O(log N)。 詳しくは B-treeの仕組み へ。
(last, first) が定義されている。先頭カラムから連続して条件が指定されるほどインデックスが効く。先頭カラム限定原則
複合インデックス (A, B, C) が効くのは以下のパターンです:
WHERE A = ?WHERE A = ? AND B = ?WHERE A = ? AND B = ? AND C = ?
逆に、以下では基本的に効きません:
WHERE B = ?(Aが指定されていない)WHERE C = ?WHERE B = ? AND C = ?
設計指針
- 頻度の高い検索パターンをリストアップ → 共通の先頭カラムを見つける
- 等価比較 → 範囲比較 → ソートの順にカラムを並べると効果的
- 不要な複合を大量に作らない。似た2つは統合できないか検討する
複合キーが自然に生まれる場面 — 多対多の連関実体
複合インデックスの典型的な出現源が、 多対多を連関実体で分解した中間テーブル だ。例えば「学生 × 科目」を分解した履修登録テーブルでは、 主キーが (学籍番号, 科目ID) の複合主キーになる。 この主キーはそのまま (学籍番号, 科目ID) の複合インデックスを兼ねる。
カラム順は「よく単独で検索するほう」を先頭に置くのが定石。 「特定学生の履修科目一覧」を頻繁に引くなら (学籍番号, 科目ID)、 「特定科目の履修者一覧」を頻繁に引くなら (科目ID, 学籍番号)。 両方の検索がバランス良く発生するなら、逆順の複合インデックスを追加で貼るのが実務での判断。
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
「なぜこの書き方が速いのか」を実行計画から説明する一冊。条件分岐・集約・結合・更新のそれぞれで、良い書き方と悪い書き方を対比しながら読める。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
ドリル 256 問を実際に打ちながら進める SQL の入門書。付属のブラウザ環境で演習できるので、SELECT から結合・集約までを環境構築で止まらずに通せる。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)