クエリを最適化するということは、
・書き換える前と後でクエリの実行結果が同じになる
・EXPLAINがよりよい実行結果を表示する
クエリの実行計画を調べるためには、
SELECT文の先頭に「EXPLAIN」をつけて実行する
##フィールド
###id/select_type
クエリの種類を表すもの。
クエリの種類とはJOIN、サブクエリ、UNIONおよびそれらの組み合わせのことで、
select_typeの内容もその組み合わせから導き出されたものである。
####JOINの場合
MySQLが実行できるJOINの種類は「Nested Look Join(NLJ)」の一種類しかない。
テーブルを一つずつ順に処理していく方式のこと。
クエリがJOINだけから構成される場合、select_typeは「SIMPLE」と表示される。
SIMPLEではidが全て同じ値になる。
EXPLAINの出力の順序がどのテーブルから処理するかということを反映している。
####サブクエリの場合
サブクエリがカラムとselect_typeには以下の5種類のうちいずれかが表示される。
・PRIMARY・・・外部クエリを示す
・SUBQUERY・・・相関関係のないサブクエリ
・DEPENDENT SUBQUERY・・・相関関係のあるサブクエリ
・UNCACHEABLE SUBQUERY・・・実行する度に結果が変わる可能性のあるサブクエリ
・DERIVED・・・FROM句で用いられているサブクエリ
DERIVEDの場合、サブクエリ→外部クエリの順番でクエリが実行
それ以外の場合は外部クエリ→サブクエリの順番でクエリが実行
サブクエリの場合、外部クエリとサブクエリでは別々のidがつけられる
####UNIONの場合
###table
アクセスする対象のテーブル
###type
対象のテーブルに対してどのような方法でアクセスするかを示す
致命的なクエリはこのフィールドを見れば一目でわかるので重要なフィールド
###possible_keys
オプティマイザがテーブルのアクセスに利用可能なインデックスの候補として挙げたキーの一覧
###key
オプティマイザによって選択されたキー。
###key_len
選択されたキーの長さ。
インデックスの走査は、キー長が短い方が高速。
インデックスをつけるカラムを選ぶときにはそのことを念頭に置いておく。
###ref
検索条件で、keyと比較されている値やカラムの種類。
定数が指定されている場合はconstと表示される。
###rows
そのテーブルからフェッチされる見積もり
###EXtra
そのクエリを実行するためにオプティマイザがどのような戦略を選択したか
ということを示すフィールドで、重要。
・Using where・・・頻繁に出力される追加情報である。WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される。
・Using index・・・クエリがインデックスだけを用いて解決できることを示す。Covering Indexを利用している場合などに表示される。
・Using filesort・・・filesort(クイックソート)でソートを行っていることを示す。
・Using filesortについては先日詳しく説明したので参照されたい。
・Using temporary・・・JOINの結果をソートしたり、DISTINCTによる重複の排除を行う場合など、クエリの実行にテンポラリテーブルが必要なことを示す。
・Using index for group-by・・・MIN()/MAX()がGROUP BY句と併用されているとき、クエリがインデックスだけを用いて解決できることを示す。
・Range checked for each record (index map: N)・・・JOINにおいてrangeまたはindex_mergeが利用される場合に表示される。
・Not exists・・・LEFT JOINにおいて、左側のテーブルからフェッチされた行にマッチする行が右側のテーブルに存在しない場合、右側のテーブルはNULLとなるが、右側のテーブルがNOT NULLとして定義されたフィールドでJOINされている場合にはマッチしない行を探せば良い・・・ということを示す。
####ref