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 = 1 | A のみ適用 | ◯ 使用される |
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 > 10 や LIKE 'abc%' のような範囲検索を指定すると、MySQLのB+Tree構造上、それ以降の第3カラム C に対するインデックス評価が停止します。
そのため、C カラムによる絞り込みが適用されず、想定より大量のレコードがスキャンされてクエリ応答速度が著しく低下する障害 が発生します。
カラム順序決定の手順
- 検索クエリの中で「完全一致(
=)」で必ず指定されるカラム(例:tenant_id)を最左(第1引数)に置く - 次にカーディナリティ(選択性・値の種類数)が高い「完全一致カラム」を第2引数に置く
- 日付範囲(
created_at >= '2026-01-01')やORDER BYに使用するカラムは、複合インデックスの最も右側に配置する