MySQLでexplainを使って実行計画を見てみる
業務で少しだけ関わったため知識を整理。 SQLの実行計画とか見だすとバックエンドエンジニア感が出てくるなぁ。
全体の流れ
- スロークエリを発見する
- 見つけたスロークエリをexplainをつけて実行
- 実行計画(特にextraやrowやtype)を見て、怪しい内容があったら修正(クエリやインデックスなど)
ツール
SequelProを利用する。普通のDBクライアントなので何となくでも使える より便利な使い方として以下も参考になる。
- ひとまず「クエリ」パネルからクエリの実行が可能。履歴も利用できる(「クエリ履歴」より)
- 記載したSQLは選択 & alt+cmd+/ でコメントアウト可能
- cmd + r で選択したSQLのみ実施可能
- インデックスの貼り方、消し方は以下参照
- 「情報」パネルから、CREATE構文が確認可能。ViewTableも同様
explainの結果で気にするべき箇所
多分他にもたくさんあるが、理解している範囲で一部だけ紹介。 とりあえずExtractをみて怪しいメッセージがないかを確認しつつ、rowsやtypeも見てダメさは無いかな?と見ていく形。
type
- 対象のテーブルに対してどのような方法でアクセスするか
- Allとかindexが表示される場合は要改善検討
rows
- フェッチされる行数の見積もり
- 少ない方が良い
Extra
- 追加情報。名前とは裏腹に重要
- Using filesort/Using temporaryあたりが表示される場合は要改善。
possible_keys, keys
- indexの貼られ具合がわかる
どう改善するか?
上の情報から、ひとまずインデックスがちゃんと貼られているか?を確認する。 他の改善方法は今後の学習課題とする。。。
参考サイト
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.8.2 EXPLAIN 出力フォーマット