MySQL
チューニング
More than 3 years have passed since last update.

クエリを最適化するということは、

・書き換える前と後でクエリの実行結果が同じになる
・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

http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html