【忘備録】MySQLでEXPLAINした時の項目の意味
[ad#co-1]
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を徹底解説!!」
[ad#co-2]
ちなみに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がかかっているかを確認しましょう。
やー、難しいですね。笑
最適化するにはまだまだ知らなければいけないことがたくさんありそうです。