【すろーくえり】

スロークエリ とは?

最終更新:
💡 実行に時間がかかりすぎる「遅いSQLクエリ」

実行に長い時間がかかるSQLクエリのこと。実行時間のログや実行計画を手掛かりに、クエリ・インデックス・待ち時間などの原因を調べて改善する。

📌 このページのポイント
スロークエリ:遅いSQLを調べる 時間のかかるSQL まず実行時間を確認 原因はさまざま 大量の読み取り 結合・ソート ロック待ちなど ログ・計画 で調べる 原因に合う 対策を選ぶ 同じ条件で 再測定する インデックス追加だけで速くなるとは限らない
記録条件はDBや設定によって異なります。実行計画と実測を手掛かりに改善します。
ひよこ ひよこ
スロークエリってどうやって見つけるの?
ペンギン先生 ペンギン先生
MySQL 8.4ではslow_query_logを有効にし、long_query_timeなどで記録条件を設定するよ。PostgreSQLではlog_min_duration_statementで指定時間以上かかった文を記録できるんだ
ひよこ ひよこ
スロークエリの原因って何があるの?
ペンギン先生 ペンギン先生
大量のデータの読み取り、効率の悪い結合やソートなどが候補だよ。ロック待ちやサーバーの負荷も関係するので、インデックス不足だけで決めつけず調べようね
ひよこ ひよこ
スロークエリを見つけたらどう対処するの?
ペンギン先生 ペンギン先生
まずEXPLAINで実行計画を調べ、どの処理に時間がかかりそうか見るよ。原因に応じてインデックスやSQLを見直し、同じ条件で実行時間を測って効果を確認するんだ
ひよこ ひよこ
インデックスを付ければ全部速くなるの?
ペンギン先生 ペンギン先生
そうではないよ。多くの行を取得する場合は全体を読むほうが効率的なこともあるんだ。通常のB-tree索引では先頭がワイルドカードのLIKEは範囲検索に使いにくいなど、索引の種類と条件も関係するよ
もっと詳しく知りたい人へ

遅いSQLがMySQLのスロークエリログに出ないのはなぜ?

MySQL 8.4ではslow_query_logの有効化に加え、log_outputの出力先やlong_query_time、min_examined_row_limitなどの記録条件を確認してください。初期のロック取得時間は実行時間に含まれず、管理用のSQLなどにも別の記録条件があります。長く待ったSQLがすべて同じ条件で記録されるわけではありません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スロークエリ」って出てきたら「実行に時間がかかるSQL」と思えばだいたいOK!
📖 おまけ:英語の意味
「Slow Query」 = 遅い問合せ
💬 Slowは「遅い」、Queryは「問合せ」で、時間のかかるデータベースへの問合せを表す言葉だよ

参考資料

← 用語集にもどる