はじめに
MySQLのexplainについてまとめる。
explain
explain
の詳細な説明は「漢のコンピュータ道」のMySQLのEXPLAINを徹底解説!! やヤフー社内でやってるMySQLチューニングセミナー大公開
を参照ください。私のメモは誤っている可能性がありますので…。
explain
の見方を簡単にメモしておく。
項目 | 内容 |
---|---|
id | 番号が入り、行ごとのselect 文を識別。サブクエリやユニオンがあると番号が1,2,...,nとなる。 |
select_type | select 文の複雑なのかを識別する。SIMPLE(単純なselect 文)、SUBQUERY(from 句以外のサブクエリ) 、DERIVED(from 句のサブクエリ)、UNION、UNION RESULT(union の無名テーブルからのselect 文) |
table | テーブル名が表示される。例えばfrom A inner join B on * inner join C on * と書くと上からC,B,A と記載される。 |
partitions | テーブルパーティションの利用状況。 |
type | 「const」: PRIMARY KEYまたはUNIQUEインデックスのルックアップによるアクセス。最も速い。「eq_ref」 : JOINにおいてPRIMARYやUNIQUE KEYが利用されたことを意味する。「ref」 : PRIMARYやUNIQUEでないインデックスを使った等価検索(where key = val)を行ったことを意味する。。「range」 : インデックスを用いた範囲検索。「index」 : インデックス全体をスキャンすることを意味する。非常に遅い。「ALL」 : フルテーブルスキャン。インデックスが利用されていないことを意味する。 |
possible_keys | クエリがアクセスする列と使用される比較演算子に基づき、クエリが利用できるインデックスを表示する。 |
key | MySQLが最適化するために使用したインデックスを表示する。 |
key_len | インデックスに使用したバイト数。 |
ref | key で表示されたインデックスと比較されたインデックス。 |
rows | MySQLが目的の行を検索する上で、必要だと推定した推定行数。 |
filtered | where 句や結合条件など何らかの条件を満たす行の割合が表示される。悲観的な推定値なので、低いと条件を見対していない行が多いことがわかる。 |
Extra | カバリングインデックスの使用やUsing where(インデックス付けが役立つを意味) など、備考情報のようなもの。 |
インデックスが有効なのかどうかはexplain
の出力結果を見る必要がある。下記の前者のクエリはインデックスがない状態で、後者はインデックスがありの状態。
# インデックスなし mysql> explain select * from ind where c1 = "aa"; +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+ | 1 | SIMPLE | ind | NULL | ALL | NULL | NULL | NULL | NULL | 998360 | 10.00 | Using where | +----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+ 1 row in set, 1 warning (0.40 sec) # インデックスあり mysql> alter table ind add index ind_c1(c1); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> explain select * from ind where c1 = "aa"; +----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+ | 1 | SIMPLE | ind | NULL | ref | ind_c1 | ind_c1 | 10 | const | 1477 | 100.00 | NULL | +----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+ 1 row in set, 1 warning (0.01 sec)