章: 第6章: セキュリティと本番運用
「重いクエリがある気がする」という勘に頼っていませんか?
本番でパフォーマンス問題が発生したとき、「たぶんこのクエリが重いはず」という勘で対応しても、インデックスを追加したのに改善しない・別のクエリが原因だったという事態になりがちです。
スロークエリログを有効にすると、実際に時間がかかっているクエリを記録し、改善対象を優先順位付きで把握できます。 勘ではなく証拠ベースで最適化を進めるための出発点です。
スロークエリログの主要設定と使い分け
| 設定項目 | 用途 | 推奨値(目安) |
slow_query_log |
ログ有効・無効の切り替え | ON |
long_query_time |
記録する閾値(秒) | 最初は 0.5 〜 1.0 秒で開始 |
slow_query_log_file |
ログの出力先パス | /var/log/mysql/slow.log など |
log_queries_not_using_indexes |
インデックス未使用クエリも記録 | ON(開発時) |
min_examined_row_limit |
調査行数が少ないクエリを除外 | 状況に応じて設定 |
チェックポイント:
long_query_timeは最初は低め(0.5秒程度)に設定して観測を始めてください。閾値を高くしすぎると問題のあるクエリが記録されずに見逃します。ログが増えすぎる場合は徐々に閾値を上げて調整します。また、mysqldumpslowコマンドでログを集計すると改善優先度が見えやすくなります。
実際のコードサンプル
-- 主要設定の確認
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 実運用では設定ファイルで有効化
まとめ & 次のステップ
- スロークエリログを有効にし、実際のボトルネックを計測ベースで特定する
long_query_timeは低め(0.5〜1秒)から始め、記録量を見ながら調整する- 記録されたクエリは
EXPLAINで実行計画を確認し、フルスキャンの有無をチェックする mysqldumpslow -s t slow.logで実行時間の合計が多いクエリから優先的に対応する- 改善前後の実行時間を必ず記録し、効果を数値で残す
次回は レプリケーションの基礎 を学びます。読み取り分散と可用性向上のためのPrimary-Replica構成の仕組みを解説します。