基礎インデックスの種類

複合インデックス

定義

複合インデックス(マルチカラムインデックス)とは、2つ以上のカラムを組み合わせて1つのインデックスとして構築したもので、先頭カラム側の条件から順に効く。

複合インデックスは「辞書順」で並ぶ

複合インデックス (A, B) は、まずAで並び替え、A内でBの順に並びます。 辞書の「アイウエオ」で1文字目→2文字目の順に並ぶのと同じです。 だから先頭カラムAが条件に無いとインデックスをたどれず、Bだけで絞り込むことはできません。

複合インデックスとカラム順
SQL
-- インデックス定義
CREATE INDEX idx_last_first
  ON people (last, first);

-- 検索クエリ
SELECT *
FROM people
WHERE last = 'Sato';
インデックスが効く

先頭カラム last で絞り込むので、辞書の「さ」行を探すのと同じ。連続した範囲だけを読む。

インデックス (last, first)
先頭でピンポイント · 3件該当

※ ここでは分かりやすさのためソート済みリスト風に描いているが、 実際はB-treeで保持されるので探索は O(log N)。 詳しくは B-treeの仕組み へ。

last
first
→ 行ID
ItoKen(1,2)
SatoAki(2,1)
SatoKen(1,0)
SatoYuki(3,0)
SuzukiAki(2,0)
SuzukiKen(3,2)
SuzukiYuki(2,3)
TanakaAki(3,1)
TanakaKen(2,2)
TanakaYuki(1,3)
YamadaKen(1,1)
該当行DBが読んだ行
インデックス (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つは統合できないか検討する

よくある疑問

Q.複合インデックスの順序はどう決めればいい?
A.「頻繁に単独で検索するカラム」「絞り込みが強い(カーディナリティが高い)カラム」を先頭に置くのが基本です。逆順にすると効かないクエリが増えます。
Q.3カラム以上の複合インデックスは効果ありますか?
A.はい。ただしカラム数が増えるほどインデックスサイズと更新コストが増えるため、実際のクエリパターンを見て必要な組み合わせだけを作るのが定石です。
Q.先頭以外のカラム条件でも効くケースはある?
A.RDBMSやオプティマイザによっては「スキップスキャン」的な最適化が働くこともありますが、期待するべきではありません。カラム順の設計を正しく行うのが原則です。

関連トピック

もっと学びたい方へ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。購入いただくと運営者に紹介料が入る場合があります。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →