MySQL複合インデックスにおける「最左プレフィックスルール」とカラム順番の決め方

MySQL Database Performance SQL
結論

最左カラム A から順に適用されます。等価条件(=)を最左に、範囲条件(>)を右側に配置します。

-- MySQL公式仕様:最左プレフィックスを考慮した複合インデックス作成
CREATE INDEX idx_orders_tenant_status_date ON orders (tenant_id, status, created_at);

MySQL公式仕様:最左プレフィックスの適用マトリクス

MySQL公式ドキュメント(dev.mysql.com/doc/refman/8.0/en/multiple-column-indexes.html)の規定通り、複合インデックス INDEX(A, B, C) は最左(最優先)のカラム A から順番に検索条件へ含まれている場合にのみ B+Tree インデックス構造が活用されます。

WHERE句の検索条件インデックス適用範囲評価判定
WHERE A = 1A のみ適用◯ 使用される
WHERE A = 1 AND B = 'active'A, B に適用◯ 最善
WHERE B = 'active'最左 A が無いため適用不可× Full Table Scan に落ちる
WHERE A = 1 AND B > 10 AND C = 'X'A, B まで適用(C は効かない△ 範囲検索 B の位置で C が失効

実際に起こる事故:範囲指定(>)による第3カラム以降のインデックス失効

複合インデックス (A, B, C) を作成した際、途中のカラム B に対して B > 10LIKE 'abc%' のような範囲検索を指定すると、MySQLのB+Tree構造上、それ以降の第3カラム C に対するインデックス評価が停止します。

そのため、C カラムによる絞り込みが適用されず、想定より大量のレコードがスキャンされてクエリ応答速度が著しく低下する障害 が発生します。


カラム順序決定の手順

  1. 検索クエリの中で「完全一致(=)」で必ず指定されるカラム(例: tenant_id)を最左(第1引数)に置く
  2. 次にカーディナリティ(選択性・値の種類数)が高い「完全一致カラム」を第2引数に置く
  3. 日付範囲(created_at >= '2026-01-01')や ORDER BY に使用するカラムは、複合インデックスの最も右側に配置する