EXPLAIN とは
SELECT 文の前に記載して実行することで、その SELECT 文のデータへのアクセス方法を知ることができます。
SELECT 文の実行に時間がかかっている場合や、index を張ったが意図通りに使用されているのかの確認などに使うことができます。
ただ、EXPLAIN の結果は見方が難しいため、少しまとめてみます。
MySQL> EXPLAIN SELECT * FROM hoge;
select_type
単一の表を参照する場合には SELECT
になる。UNION を使用すると、PRIMARY
, UNION
, 'UNION RESULT' などが現れる。
type
type はレコードアクセスタイプとも呼ばれ、そのテーブルにどのようにアクセスするのかを表しています。
実行速度が遅い場合は、ここを見ることで原因が分かる場合があります。
type の種類
- const
- PK や UNIQUE インデックスの等価検索時のタイプ
- 問題なし
- ref
- UNIQUE 出ないインデックス使用検索時
- 大抵問題なし
- セカンダリインデックスを禁止していたら問題あり
- range
- Index を用いた範囲検索時
- ちょっと注意
- index
- index 内のフルスキャン
- かなり注意
- 場合によってはダメ
- ALL
- 全表操作
- すごく小さいことが保証されるテーブルの参照以外は改善が必要
key
key には PRIMARY KEY
かセカンダリインデックス名が入っているべきであり、もしセカンダリインデックスを禁止しているとすると、PRIMARY KEY 以外入ってはならない
possible_keys
使うことのできる key の候補。ここから一番効率がいいと思われる key が選択される。
ヒント句
SELECT 文に key に対するヒント句を付与することで、使ってほしい key を指定することができる。(インデックスヒントの構文)
SELECT * FROM t1 USE INDEX (i1);
SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;
Extra
付帯情報であるが、かなり大事な項目。
Extra の内容
- Using where
- 頻繁に出力される追加情報で、あまり気にする必要はない
- Using index
- クエリがインデックスだけを用いて解決できることを示す
- Covering Index を使用している場合などに表示される
- Using index が Extra に表示されるようにインデックスを貼るのが一つの目標
- Using index condition
- クエリがインデックスの値を一部利用できることを示す
- Using filesort
- filesort(クイックソート) でソートを行っていることを示す
- これが出ている場合は、インデックスをうまく使ってソートをしなくてすむ設計にできないかを考える