遅いクエリの最適化は、まず 実行計画(EXPLAIN / EXPLAIN ANALYZE)を見てボトルネックを特定するところから始めます。そのうえで、インデックス追加、クエリの書き換え、不要な処理の削減などを行います。
1. EXPLAIN で分析する
sql
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 5;
実行計画では次のような点を確認します。
text
Seq Scan → 全表走査。大きなテーブルでは遅くなりやすい
Index Scan → インデックスを使っている
Rows / Cost → 推定行数やコスト
Actual time → 実際の実行時間
2. 適切なインデックスを追加する
sql
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
WHERE、JOIN、ORDER BY、GROUP BY で頻繁に使う列はインデックス候補になります。ただし、インデックスは書き込みコストとストレージも増やすため、実際のクエリに基づいて追加します。
よくあるアンチパターン
sql
WHERE LOWER(email) = '[email protected]' -- 通常の index が効きにくい
WHERE name LIKE '%john%' -- 先頭ワイルドカードは index が効きにくい
SELECT * FROM large_table -- 不要な列まで読む
その他、N+1 クエリ、不要な JOIN、巨大な OFFSET ページングも遅さの原因になります。
実用的な改善策
text
✓ 実行計画を見る
✓ 必要な列だけ SELECT する
✓ 適切な index / composite index を作る
✓ JOIN 条件と WHERE 条件を見直す
✓ N+1 を batch query や JOIN に置き換える
✓ 大きなテーブルでは partitioning や pagination 戦略を検討する
なぜ重要なのか
SQL の性能問題はアプリケーション全体のレスポンスに直結します。推測で直すのではなく、実行計画を見て原因を特定し、最小限の変更で効果を確認する姿勢が重要です。インデックス、実行計画、アンチパターンを理解していることは、実運用で遅いクエリを改善するための基本です。
