SQL インデックスが効かないパターン集

目次

EXPLAIN で Seq Scan になっていたら疑うポイント。

カラムに関数をかけている

-- NG: created_at のインデックスが使えない
SELECT * FROM orders WHERE date_trunc('day', created_at) = '2026-07-22';

-- OK: 範囲条件に書き換える
SELECT * FROM orders
WHERE created_at >= '2026-07-22' AND created_at < '2026-07-23';

前方一致以外の LIKE

-- NG: 中間一致はインデックスが効かない
SELECT * FROM users WHERE email LIKE '%@example.com';

-- OK: 前方一致なら効く(C ロケール or text_pattern_ops)
SELECT * FROM users WHERE email LIKE 'naxii@%';

中間一致がどうしても必要なら pg_trgm の GIN インデックスを検討する。

複合インデックスの順序ミス

(a, b) の複合インデックスは次のように働く。

WHERE 句 インデックス利用
a = ? 効く
a = ? AND b = ? 効く
b = ? のみ 効かない

複合インデックスは「等価条件で絞るカラムを先、範囲条件を後」が基本。