【忘備録】MySQLでEXPLAINした時の項目の意味

Pocket

MySQLの忘備録はこれからもどんどん書いていこうかなと思っております。
もう筆者も新卒2年目なんで、それくらい知っとけよって話ではあるかもしれませんが…

筆者は
「あれ、selectしても全然返ってこねぇ…」
なんて時にEXPLAINを実行するのはいいんですが、全然理解してない!笑
ってことで、ちょっと見ていきましょう

各項目の意味

type

次の値のいずれかが出るみたいです。
効率の順番で並べます。

system
テーブルに一つしかない状態

const
マッチするレコードが1件しかない状態

eq_ref
それぞれのレコードと結合を行う際、このテーブルから1レコードが読まれる。
インデックスのすべての部分が結合で使用され、かつインデックスがユニークキーかプライマリキーであるときにこの値になる

ref
いくつかのマッチするレコードだけが使用されている状態、
ユニークキーやプライマリキーが使用されている場合は除く

range
示された範囲内にあるレコードだけが検索される

index
すべてのレコードのインデックスを調べる

ALL
もうね、すべて。笑

possible_keys

テーブルからレコードを見つけるためにどのインデックスを使用できたかを示す
この項目が空の場合、関連したインデックスがないことを意味する

key

MySQLが実際に使用すると決めたキーを示す

key_len

MySQLが使用すると決めたキーの長さを示す。
つまい、keyがnullなら、この項目もnullになる。

ref

テーブルからレコードをSELECTするために、どのフィールドや定数がインデックスとともに使用されたかを示す。

rows

MySQLがクエリを実行するために検査する必要があると考えているレコード数

みたいな感じらしいです。
もっと詳しく知りたい人は奥野さんのブログからどうぞ。
「MySQLのEXPLAINを徹底解説!!」

ちなみにMySQLのIndexは宣言順です

これがなかなかややこしい。

show create table (table名)

とかでindexを見ると下記のようなのがあるとします。

KEY `IX_PROFILE` (`REGISTER_TIME`,`GENDER`,`BIRTHDATE`)

この場合、IX_PROFILEが使用されるのは以下の3パターンのみです。
1. REGISTER_TIMEのみ
2. REGISTER_TIMEとGENDERのとき
3. REGISTER_TIMEとGENDERとBIRTHDATEのとき
たとえば、GENDERのみとか、REGISTER_TIMEとBIRTHDATEでINDEXかけようとしてもかかりません。
どんなINDEXになっているのかをちゃんと把握した上で、実際に投げてみて、INDEXがかかっているかを確認しましょう。

やー、難しいですね。笑
最適化するにはまだまだ知らなければいけないことがたくさんありそうです。

Pocket

Tags: