query_reviewer はページで実行されているクエリーの数、費やされた時間を表示し、SQL コードを自動的に分析して潜在的な問題を見つけてくれます。例えば、MySQL インデックスを使用していないクエリーなどです。
select_type, table, type, possible_keys, key, key_len, ref, rows, extra
1.
select_typeはクエリの種類(JOIN、サブクエリ、UNION)
SIMPLE |
単純なSELECT (UNION やサブクエリを使用しない)。 |
PRIMARY |
最外部のSELECT 。 |
UNION |
内の第2およびそれ以降のSELECT ステートメント。 |
DEPENDENT UNION |
UNION 内の第2およびそれ以降のSELECT ステートメント内のUNION 、外側のサブクエリに依存する。 |
UNION RESULT |
UNION の結果。 |
SUBQUERY |
サブクエリ内の第一SELECT 。 |
DEPENDENT SUBQUERY |
第1SELECT 、外側のサブクエリに依存する。 |
DERIVED |
派生テーブルSELECT (FROM 節内のサブクエリ) |
UNCACHEABLE SUBQUERY |
結果がキャッシュされず、外側のクエリの各行ごとに再評価されるサブクエリ。 |
2.
typeレコードアクセスタイプとも呼ばれ
const・・・PRIMARY KEYまたはUNIQUEインデックスのルックアップによるアクセス。最速。
eq_ref・・・JOINにおいてPRIARY KEYまたはUNIQUE KEYが利用される時のアクセスタイプ。constと似ているがJOINで用いられるところが違う。
ref・・・ユニーク(PRIMARY or UNIQUE)でないインデックスを使って等価検索(WHERE key = value)を行った時に使われるアクセスタイプ。
range・・・インデックスを用いた範囲検索。
index・・・フルインデックススキャン。インデックス全体をスキャンする必要があるのでとても遅い。
ALL・・・フルテーブルスキャン。インデックスがまったく利用されていないことを示す。OLTP系の処理では改善必須。
possible_keys
オプティマイザがテーブルのアクセスに利用可能なインデックスの候補として挙げたキーの一覧。
key
オプティマイザによって選択されたキー。
key_len
選択されたキーの長さ。インデックスの走査は、キー長が短い方が高速である。インデックスをつけるカラムを選ぶ時にはそのことを念頭に置いて欲しい。
ref
検索条件で、keyと比較されている値やカラムの種類
rows
そのテーブルからフェッチされる行数の見積もりである。
Extra
Using where・・・頻繁に出力される追加情報である。WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することが出来ない場合に表示される。
Using index・・・クエリがインデックスだけを用いて解決できることを示す。Covering Indexを利用している場合などに表示される。
Using filesort・・・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において、左側のテーブルからフェッチされた行にマッチする行が右側のテーブルに存在しない場合、右側のテーブルはN
まとめ
- id/select_type/tableフィールドを見て、どのテーブルがどの順序でアクセスされるのかを知る。これらはクエリの構造を示すフィールドであると言える。サブクエリが含まれている場合にはEXPLAINの表示順とアクセスされる順序が異なる場合があるので気をつける必要がある。
- type/key/ref/rowsフィールドを見て、各テーブルから行がどのようにフェッチされるのかを知る。どのテーブルへのアクセスが最も重いか(クエリの性能の足を引っ張っているのか)を、これらのフィールドから判断することが出来る。
- Extraフィールドを見て、オプティマイザがどのように判断して、各々のテーブルへのアクセスにおいて何を実行しているのかを知る。Extraフィールドはオプティマイザの挙動を示すものであり、クエリの全体像を把握するのに役立つ。
|