プログラミング、フリーダイビング、旅行のブログ

プログラミング道場

adsense

MySQLのexplainの見方

更新日:

この記事では、MySQLのexplainコマンドの見方を紹介します。
explainコマンドとは、SQLの実行計画を教えてくれるコマンドです。
explainコマンドの見方を知っておけば、きっと効率の良いSQLを書く際に役立つはずです。

本記事の内容

  • type
  • key
  • key_len
  • ref
  • row
  • extra
  • まとめ

type

type 説明
const PRIMARY KEYまたはUNIQUEインデックスのルックアップによるアクセス
最速
eq_ref JOINにおいてPRIARY KEYまたはUNIQUE KEYが利用される時のアクセスタイプ
constと似ているがJOINで用いられるところが違う
ref PRIMARY KEYまたはUNIQUEインデックスのルックアップによるアクセス
最速
range インデックスを用いた範囲検索
index フルインデックススキャン
インデックス全体をスキャンする必要があるのでとても遅い
ALL フルテーブルスキャン
インデックスがまったく利用されていないことを示す
OLTP系の処理では改善必須

key

オプティマイザによって選択されたキー。

key_len

選択されたキーの長さ。
インデックスの走査は、キー長が短い方が高速です。
インデックスをつけるカラムを選ぶ時には、そのことを念頭に置いて下さい。

ref

検索条件で、keyと比較されている値やカラムの種類。
定数が指定されている場合はconstと表示される。
JOINが実行されている時には、結合する相手側のテーブルで検索条件として利用されているカラムが表示される。

row

そのテーブルからフェッチされる行数の見積もりです。
このフィールドはあくまでもテーブル全体の行数やインデックスの分散具合から導き出された大まかな見積もりなので、実際にフェッチされる正確な行数ではないので注意が必要です。

extra

カラム 説明
Using where 頻繁に出力される追加情報
WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される。
Using index クエリがインデックスだけを用いて解決できることを示す
Covering Indexを利用している場合などに表示される
Using filesort filesort(クイックソート)でソートを行っていることを示す
Using temporary JOINの結果をソートしたり、DISTINCTによる重複の排除を行う場合など、クエリの実行にテンポラリテーブルが必要なことを示す
Using index for group-by MIN()/MAX()がGROUP BY句と併用されているとき、クエリがインデックスだけを用いて解決できることを示す
Range checked for each record JOINにおいてrangeまたはindex_mergeが利用される場合に表示される
Not exists MySQL はクエリーに対する LEFT JOIN 最適化を実行でき、LEFT JOIN 条件に一致する 1 つの行が見つかったら、前の行の組み合わせについて、このテーブルでそれ以上の行を調査しません。

まとめ

この記事は、こちらの記事を参考にして書かせていただきました。

explainコマンドを知ることは、高速のSQLを書く第一歩です。
是非、この記事を見ながらSQLの実行計画と格闘して下さい。

Good luck for your engineer life!

-MySQL, プログラミング

Copyright© プログラミング道場 , 2019 All Rights Reserved Powered by AFFINGER4.