複合インデックスの列順
最左一致のルールと、ワークロードに適した列順の選び方を学びます。
「複合インデックスの列順」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
複合インデックスに関する質問
単一列インデックスを説明できるようになると、面接官は質問の難度を上げてきます。「customer_idとorder_dateを一緒に使って検索します。どのようにインデックスを作成しますか」という質問です。期待される答えは、複合インデックス(マルチカラムインデックス)と、列の順序についての説明です。
このレッスンでは、これから受ける複合インデックスに関するほぼすべての質問を説明できる、1つの重要な考え方である左端プレフィックスルールを学びます。
複合インデックスとは
複合インデックスは、複数の列を順序付きタプルとしてインデックス化します。エントリは最初の列でソートされ、同値の場合は次に2番目の列でソートされ、その後も同様に並びます。これは、姓、次に名の順で並んだ電話帳とまったく同じです。
宣言した列の順序に従ってソートの優先順位が決まるため、順序は非常に重要です。
CREATE INDEX idx_orders_cust_date
ON orders (customer_id, order_date);左端プレフィックスルール
基本ルールは次のとおりです。(A, B, C)に対する複合インデックスは、列の左端プレフィックスでフィルタリングするクエリに使用できます。
Aだけなら、使用できますA, Bなら、使用できますA, B, Cなら、使用できますBだけでは、使用できませんB, Cでは、使用できません
電話帳を思い浮かべてください。姓が「Smith」の人全員を見つけることはできますが、姓に関係なく名が「John」の人全員を効率よく見つけることはできません。電話帳がその順番でソートされていないからです。
実例:プレフィックスに一致する場合
(customer_id, order_date)に対するインデックスがある場合、次のクエリはcustomer_idから始まるため、このインデックスを使用できます。
1つ目は先頭列だけを使います。2つ目は両方の列を使い、まずcustomer_idで絞り込み、その顧客の中で日付順に並んだエントリを検索します。
-- Uses the index (leading column)
SELECT * FROM orders WHERE customer_id = 42;
-- Uses the index fully (both columns, in order)
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';実例:プレフィックスに一致しない場合
このクエリは2番目の列だけでフィルタリングするため、(customer_id, order_date)に対するインデックスは、通常、検索の起点として使用できません。エントリがorder_dateの全体順でソートされていないからです。
order_dateだけでフィルタリングするパターンが一般的なら、order_dateを先頭に置いた別のインデックスが必要です。
-- Does NOT use idx_orders_cust_date efficiently
SELECT * FROM orders
WHERE order_date >= '2026-01-01';
-- Fix: an index that leads with order_date
CREATE INDEX idx_orders_date ON orders (order_date);範囲検索より先に等価検索
シニアレベルの補足です。等価検索(=)に使う列を、範囲検索 (<, >, BETWEEN)に使う列より前に配置します。インデックスが範囲列に到達すると、それより後ろの列を使って検索範囲をさらに絞り込むことはできなくなります。
status = 'paid' AND created_at > ?のようなクエリでは、正しい順序は逆順ではなく(status, created_at)です。
-- Query: WHERE status = 'paid' AND created_at > '2026-01-01'
-- Good: equality column first
CREATE INDEX idx_orders_status_created
ON orders (status, created_at);先頭列を選ぶ
どの列を先頭に置くかは、どのように決めればよいでしょうか。面接官が求めているのは、ワークロードに基づく答えです。
- 最も多くのクエリに登場する列を先頭にします。特に等価検索のフィルターとして使われる列を優先します。
- 選択性の高い列(異なる値が多い列)を優先し、最初の段階で最も多くの行を除外できるようにします。
- ORDER BYの要件を考慮します。インデックスの順序を一致させれば、ソートを回避できます。
先頭列には、実際のクエリの組み合わせ全体で最も大きな絞り込み効果を持つ列を選びます。
複合インデックスはソートにも役立つ
複合インデックスは、左端プレフィックスに対するORDER BYにも使用できます。エントリはcustomer_id、次にorder_dateの順でソートされているため、ある顧客の注文を日付順に並べるクエリでは、別途ソートする必要がなく、ほぼコストなしで処理できます。
-- No sort step: the index already supplies this order
SELECT * FROM orders
WHERE customer_id = 42
ORDER BY order_date;冗長なインデックスを重ねない
候補者はインデックスを作りすぎることがよくあります。すでに(customer_id, order_date)がある場合、(customer_id)だけを対象にした別のインデックスは通常冗長です。複合インデックスですでに先頭列を使うクエリをカバーできるからです。
インデックスを追加するたびにストレージを消費し、書き込みも遅くなります。そのため目標は、列ごとに1つのインデックスを作ることではなく、クエリパターンをカバーする最小限のインデックス集合です。
EXPLAINで証明する
いつものように、プランナーの選択を確認します。複合インデックスを作成した後にEXPLAINを実行し、Index Scanとして表示されているか、また推定行数がいくつかを確認してください。
プレフィックスが一致しないクエリがシーケンシャルスキャンに戻った場合、それは列の順序がワークロードに適していないことを示す証拠です。面接官にもまさにそのように説明できます。
EXPLAIN
SELECT * FROM orders
WHERE customer_id = 42
AND order_date >= '2026-01-01';面接での伝え方
簡潔にまとめると、次のようになります。
「複合インデックスは列を左から右の順にソートするため、それらの列の左端プレフィックスには使用できますが、後ろの列だけを対象にすることはできません。最も頻繁に絞り込みに使う選択性の高い列を先頭に置き、等価検索の述語を範囲検索の述語より前に配置し、可能であればORDER BYにも順序を合わせます。そのうえでEXPLAINを使って検証します。」
クイックチェック
左端プレフィックスのルールを適用してください。
振り返り:複合インデックスの順序
重要なポイント:
- 複合インデックスは左から右に並べられるため、列の左端プレフィックスに対してのみ機能します。
- 最も頻繁にクエリされ、選択性の高い列を先頭にします。
- 等価条件の列を範囲条件の列より前に配置します。
- 一致するプレフィックスは、ソートなしで
ORDER BYも満たせます。 - 複合インデックスですでにカバーされている冗長な単一列インデックスは避け、
EXPLAINで検証します。
次は、ヒープフェッチを完全になくすカバリングインデックスです。
よくある質問
「複合インデックスの列順」レッスンは無料ですか?
はい。「複合インデックスの列順」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「複合インデックスの列順」で何を学びますか?
最左一致のルールと、ワークロードに適した列順の選び方を学びます。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「複合インデックスの列順」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。