【すろーくえり】

スロークエリ とは?

💡 実行に時間がかかりすぎる「遅いSQLクエリ」
📌 このページのポイント
スロークエリの検出と改善 改善前:スロークエリ SELECT * FROM users WHERE name = '...' 実行時間: 3.2秒(フルスキャン) 改善後:インデックス追加 CREATE INDEX idx_name ON users(name) 実行時間: 0.005秒(索引検索) スロークエリの検出と対策フロー スローログ検出 EXPLAIN分析 原因特定 インデックス追加/ クエリ最適化 実行に時間がかかるSQLを検出し最適化する
スロークエリのイメージ
ひよこ ひよこ

スロークエリってどうやって見つけるの?

ペンギン先生 ペンギン先生

MySQLなら「slow_query_log」を有効にして、「long_query_time」で閾値を設定する(デフォルト10秒だけど1秒以下にすることが多い)。閾値を超えたクエリが自動でログファイルに記録されるよ。PostgreSQLなら「log_min_duration_statement」で同じことができる。

ひよこ ひよこ

スロークエリの原因って何が多いの?

ペンギン先生 ペンギン先生

一番多いのは「WHERE句のカラムインデックスがなくてフルテーブルスキャンしている」パターン。次に多いのは「JOINの結合カラムインデックスがない」「不要なデータまで取得している(SELECT *)」「サブクエリが非効率」など。データが少ないうちは速いのに、本番でデータが増えたら急に遅くなるのがよくあるケース。

ひよこ ひよこ

スロークエリを見つけたらどう対処するの?

ペンギン先生 ペンギン先生

まずEXPLAIN実行計画を確認。インデックスが使われているか、フルスキャンになっていないかを見る。インデックス追加で解決できることが多いけど、クエリの書き換え(JOINの見直し、サブクエリの排除など)が必要な場合もある。

ひよこ ひよこ

インデックスを付ければ全部速くなるの?

ペンギン先生 ペンギン先生

そう単純ではないんだ。例えば「WHERE status = 'active'」でレコードの90%がactiveなら、インデックスを使うよりフルスキャンのほうが速い場合がある。カーディナリティ(値の種類の多さ)が低いカラムインデックスは効きにくい。あとLIKE '%検索語%'のように前方一致でないパターンや、カラムに関数を適用する「WHERE YEAR(created_at) = 2024」もインデックスが効かない。実行計画を読めるようになるまでは地道に経験を積むしかない部分なんだよね。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
スロークエリって出てきたら「実行に時間がかかりすぎるSQL、ログで検出してインデックスクエリ改善で対処する」と思えばだいたいOK!
📖 おまけ:英語の意味
「Slow Query」 = 遅い(Slow)問合せ(Query)
💬 そのまま「遅いクエリ」。データベースのパフォーマンス問題を見つけるための重要な指標
← 用語集にもどる