MySQLのこと。

MySQLのことについてまとめているブログ。他人に見せる用でもなく、自分の勉強備忘録。検索インデックスも外してるので、辿りついた方・・・ようこそ。そんな大した情報ないですよ?!たまにアルゴリズムの練習も

MySQLのexplainに関するまとめ

はじめに

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)

参考文献