MySQL EXPLAINを調べた


MySQL Explain

MySQL Explainとは、DBがデータを探す一連の過程を人が読みやすくDB結果セットに示すもの。
MySQL Explainを使って、既存のクエリをチューニングすることができるだけでなく、インデックス戦略策定などのパフォーマンスの最適化のための全般的な業務を処理することができる。

使い方

EXPLAIN [EXTENDED] SELECT ... FROM ... WHERE ...
項目 説明
id select IDでSELECTを区別する番号
table 参照するテーブル
select_type selectのタイプ
type タイプ
possible_keys データを照会するときDBで使用できるインデックスリスト
key 実際に使うインデックス
key_len 際に使うインデックスの長さ
ref 中のインデックスと比較するカラム
rows クエリの実行時に調べる行
extra 追加情報

出力結果(例)

********************** 1. row **********************
           id: 1
  select_type: SIMPLE
        table: categories
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: 
1 row in set (0.00 sec)

select_type

SIMPLE : サブクエリや「union」がない最も単純なselect文
PRIMARY :最も外側のselect文
DERIVED :from文の中にあるサブクエリのselect文
SUBQUERY :最も外側のselect文のサブクエリ
DEPENDENT SUBQUERY : 基本的にSUBQUERYのようなタイプで、最も外側のselect文に「依存性」を持つサブクエリのselect文
UNION : union問い合わせ第二select文
DEPENDENT UNION : 外クエリに依存性を持つunion問い合わせ第二select文

type

system:0個または1つのrowを持つテーブル
const:テーブルに条件を満たしているレコードが一つであるとき、定数扱い
eq_ref:primary keyやunique not null columnに生成されたインデックスを使用して、結合している場合
ref:インデックスで指定されたカラム同士の '='、 '<=>'などの演算子を使用した比較で行われる結合
unique_subquery:1つの結果だけを返す 'IN'が含まれているサブクエリの場合
index_subquery:unique_subqueryと似ていますが、複数の結果を返す
range:特定の範囲のrowsをマッチングさせるインデックスが使用されている場合。 BETWEENやIN、 '>'、 '> ='などが使用される
all:結合時にすべてのテーブルのすべてのrowをスキャンする場合である。もちろん性能が最も良くない。

extra

項目 説明
using index カバーリングインデックス、インデックスデータ構造を利用してデータを抽出
using where where条件でデータを抽出。typeがALLあるいはIndxタイプと一緒に表現すると、性能が良くないことを意味
using filesort データの並べ替えが必要な場合に、メモリやディスク上でのソートの両方を含む。
using temporary クエリ処理時に内部的にtemporary tableが使われる場合を意味する