はじめに
開発をしていると、「このクエリ遅くない?」という場面に必ず遭遇します。
特に「データ量が増えた」「リリース後に遅くなった」「特定の画面だけ重い」などといったケースでは、クエリが原因になっていることが多いです。
ただし、なんとなくクエリを直すだけでは根本解決にならないこともよくあります。
この記事では、実務で行っている遅いクエリの調査方法についてまとめます。
① まずは遅いクエリを特定する
最初にやるべきはどのクエリが遅いのかを特定することです。
例えば下記などです。
・ログを確認する
・APMツールを見る
・実行時間を計測する
ここを曖昧にしたまま修正すると関係ない箇所を触ってしまったり、
無駄な最適化をすることになります。
② EXPLAINで実行計画を確認する
次にやるのがこれです。
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
ここで見るポイントは下記などです。
・フルスキャンになっていないか
・インデックスが使われているか
・行数(rows)が多すぎないか
👉 DBが「どうやってそのクエリを処理しているか」を把握する
③ インデックスの有無を確認する
よくある原因がこれです。
・WHERE条件のカラムにインデックスがない
・JOINキーにインデックスがない
この状態だと、
👉 全件スキャンになりやすい
対策👇
・検索条件にインデックスを貼る
・複合インデックスを検討する
④ クエリの書き方を見直す
インデックスがあっても、書き方によっては効きません。
例えば
WHERE DATE(created_at) = '2024-01-01'
これはインデックスが効きません。
改善👇
WHERE created_at >= '2024-01-01'
AND created_at < '2024-01-02'
👉 インデックスが使える形に書くことが重要
まとめ
遅いクエリの調査手順は下記です。
・遅いクエリを特定する
・EXPLAINで実行計画を見る
・インデックスを確認する
・クエリの書き方を見直す
重要なのは感覚ではなく、根拠を持って改善することです。
告知
もし興味があればですが、
案件に関わる中で一緒に開発できるエンジニアの方ともつながれたら嬉しいです。
・フリーランス
・副業
・業務委託
などで案件を探している方がいれば気軽にDMください。