【くえりさいてきか】

クエリ最適化 とは?

💡 遅いSQLを「速く効率的に動くように改善する」技術
📌 このページのポイント
クエリ最適化 — 実行計画の比較 最適化前(フルスキャン) テーブル全行を走査 100万行すべてチェック 不要な結合も実行 遅い(数十秒) 最適化後(インデックス活用) インデックスで直接アクセス 必要な行だけ取得 結合順序も最適化 高速(ミリ秒) オプティマイザが最適な実行計画を自動選択
クエリ最適化による実行計画の違い
ひよこ ひよこ

クエリ最適化って何から始めればいいの?

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

まずスロークエリログで遅いクエリを特定する。次にEXPLAINでそのクエリ実行計画を見て「フルテーブルスキャンしていないか」「インデックスが使われているか」を確認。ここから具体的な改善策を考えるのが王道の流れだよ。

ひよこ ひよこ

インデックスを追加する以外にどんな改善があるの?

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

いくつか代表的なものを挙げると、SELECT *をやめて必要カラムだけ取得する、サブクエリJOINに書き換える、ORをUNIONに書き換える、LIMIT付きのページングで全件取得を避ける、一時テーブルCTEで中間結果を整理するなど。クエリの書き方だけで10倍以上速くなることも珍しくないよ。

ひよこ ひよこ

データベースが勝手に最適化してくれるんじゃないの?

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

データベースにはオプティマイザという最適化エンジンがあって、JOINの順序やインデックスの選択を自動で判断してくれる。でもオプティマイザも万能ではなくて、統計情報が古かったり、複雑なクエリだと最適な計画を選べないことがある。

ひよこ ひよこ

最適化ってどこまでやるべき?

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

「遅くないクエリを無理に速くする」のは時間の無駄。まずスロークエリログで実際に問題になっているものから対処するのが鉄則。あと、インデックスの追加は読み取りを速くするけど書き込みは遅くなるから、読み書きのバランスも考えないといけない。最適化の沼にハマると「インデックスを増やしたらINSERTが遅くなって、そっちを直したら別のSELECTが遅くなって...」という堂々巡りになることがあって、全体のワークロードを俯瞰して優先順位をつける判断力が求められるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
クエリ最適化って出てきたら「EXPLAIN実行計画を見て、インデックスクエリの書き方を改善する作業」と思えばだいたいOK!
📖 おまけ:英語の意味
「Query Optimization」 = 問合せ(Query)の最適化(Optimization)
💬 Optimizationは「最も良い状態にする」という意味。クエリを最も効率的に実行できるようにすること
← 用語集にもどる