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 = ? のみ |
効かない |
複合インデックスは「等価条件で絞るカラムを先、範囲条件を後」が基本。
Naxii の置き場