記事の内容
この記事では、MySQLのexplainコマンドの見方を紹介します。
explainコマンドとは、SQLの実行計画を教えてくれるコマンドです。
explainコマンドの見方を知っておけば、きっと効率の良いSQLを書く際に役立つはずです。
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の実行計画と格闘して下さい。
また、explainやshow statusといったコマンドの詳細については、この本に書かれています。
Good luck for your engineer life!