MySQLのExplainの読み方メモ
MySQLのExplain。前職にいたときはIndexを通っててFilesortがないことくらいしか確認していなかったが、改めて読み方を整理してみるメモ。
- id
- SQL内で出されるSELECT文1つ1つに割り当てられる番号。クエリー内の実行順というわけではない。サブクエリを出した場合は、PRIMARYに1番、サブクエリに2番などというようにつけられる。
- select_type
- クエリ内で実行されたSQLの種類。普通はSIMPLE。ネストされたSQLやUNIONした場合はクエリーの中での位置づけによりPRIMARY、UNION、DPENDENT UNION、SUBQUERY、DEPENDENT SUBQUERY、DERIVEDのいずれかが付けられる。
- table
- 参照しているテーブル名。
- type
- 対象のテーブルに対して索引を使っているか否か、また使っているならばどう使っているかが分かる。const、eq_ref、rangeなどなどはインデックスをそれぞれの条件にあわせて有効活用できていると言えそう。特に気をつけるのはここがindex又はALLの場合のようだ。indexはインデックスをフルスキャンしているので遅い(ALLよりはマシ)。ALLの場合はテーブルフルスキャン。小さなテーブルの全件更新バッチなど、本当にフルスキャンが必要な処理以外は改善必須。
- possible_keys
- オプティマイザが使用するインデックスの候補として挙げたキーの一覧。
- key
- possible_keysの中から実際にオプティマイザが選択した物
- key_len
- keyの長さ。
- ref
- 検索時にkeyの比較対象となっているカラム。定数の場合はconstと表示される。
- rows
- クエリによって取得が想定される行数。実際に取得された数ではないところに注意が必要。実際やってみると結構違う。
- Extra
- クエリの追加情報。Using filesort、Using temporaryが表示された場合は注意が必要。filesortは取得結果に対してクイックソートが走っていることを示していて、using temporaryはクエリの処理に一時テーブルが必要であったことを示す。Using filesortとUsing temporaryが同時に表示された場合は、filesortの対象が何件になるのか考えチューニングしていくのが良さそう。
と、ここまで色々書きましたがこちらのサイトが極めて分かりやすくまとめてくれているので、こちらを参照された方が良いですね。
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!