エンジニアはこわくない

好きなように書く

個人的にMYSQLのEXPLAINを見て注意すること


スポンサーリンク

f:id:tsujitaku50:20170209163940p:plain

こんにちは、つじたく(@Tsuji_Taku50)です。

この記事は2年ほど前にQiitaに投稿した記事に少し修正を加えたものになります。 qiita.com

新しく得た知識なども、この記事に追記していこうと思います。

EXPLAINについて

MYSQLにはEXPLAINというものがあります。

これはクエリを実行した際に、

MYSQLが作成したクエリをどのように判断して実行したのか」

というものが見れるようなものです。

言い換えると

MYSQLが内部的にどのようにしてデータへのアクセスをしているか」

ということになります。

EXPLAINの実行方法

実行方法は簡単でSQLクエリの先頭にEXPLAINをつけるだけです。

EXPLAIN SELECT * FROM テーブル名;

+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL | 62004 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.00 sec)

おおよそ上記のようなものが表示されます。

カラムの解説

select_type

単一の表を参照する場合は「SIMPLE」になるです。

UNIONクエリを使用すると

「PRIMARY」、「UNION」、「UNION RESULT」

なども表示されると思います。

type

const・・・PKやUNIQUEインデックスの等価検索

ref・・・UNIQUEでないインデックス使用検索時。 セカンダリインデックスを禁止していたら問題大あり

range・・・INDEXを用いた範囲検索時

index・・・INDEX内のフルスキャン

ALL・・・全表走査。インデックスが効いていない状態。

key

keyには「PRIMARY KEY」か「セカンダリインデックス名」が入っているべき。(多分)

セカンダリインデックスを禁止していればPRIMARY KEY以外入ってはいけません。

EXTRA(付与情報)

Using where・・・頻繁に出力される追加情報であまり気にする必要はない

Using index・・・クエリがインデックスだけを用いて解決できることを示しています。カバリングインデックスを利用している場合などに表示されます。

Using filesort・・・ソートを行っています。適切なインデックスを張ることで改善されるかもしれないことを表しています。

さいごに

EXPLAINは僕にとってまだまだ未知の領域で使いこなすのが難しいですが、

勉強を続けていきたいですね。

おわり!!