explain提供了MySQL是如何执行语句的详细信息,开发人员可以根据这些信息对执行的语句进行性能方面的优化。explain可以与SELECTINSERTUPDATEDELETE语句一起使用。

1. MySQL 版本

1
2
3
4
5
6
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.21-log |
+------------+

2. explain 格式

1
2
3
4
5
6
mysql> explain select * from emp;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 503106 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------+
字段 描述
id 查询语句标识符。数值越大优先级别越高,就越先执行。如果数值一样,则由上至下依次执行。NULL值表示这是一个结果集,不需要参与查询。
select_type 查询类型。常见的有:
1) SIMPLE
 简单的SELECT查询。没有UNION或子查询。
2) PRIMARY
 最外层的SELECT语句。
3) UNION
 UNION语句中的第二个或后面的查询。
4) DEPENDENT UNION
 UNION语句中的第二个或后面的查询。取决于外层的查询。
5) UNION RESULT
 UNION的结果集。
6) SUBQUERY
 子查询中的第一个SELECT。
7) DEPENDENT SUBQUERY
 子查询中的第一个SELECT。取决于外层的查询。
8) DERIVED
 FROM子句中出现的子查询。也叫派生表。
table 查询的表名。
1) 如果查询使用了别名,则显示该别名;
2) 如果不涉及对数据表的操作,则显示NULL;
3) <unionM,N> 表示引用id为M和N的执行计划UNION的结果;
4) <derivedN> 表示引用id为N的执行计划中派生的表(临时表);
5) <subqueryN> 表示引用id为N的子查询的结果;
partitions 使用的表分区。如果没有分区,则显示NULL。
type 关联类型。MySQL会认为任何查询都是关联查询,其性能从最好到最差依次为:
1) system
 表中仅有一行数据。它是const的一个特列。
2) const
 表中最多只有一个与之匹配的行。常见于使用唯一索引和常量值进行比较时。
3) eq_ref
 当多表链接使用非空唯一索引作为关联条件的时候。
4) ref
 当使用唯一索引的最左前缀或非唯一索引时。
5) fulltext
 使用全文索引进行关联。
6) ref_or_null
 和ref相似,另外MySQL还会检索值为NULL的行。
7) index_merge
 使用了索引合并优化。
8) unique_subquery
 发生在IN子查询中,且子查询使用唯一索引。其形式为:
 value IN (SELECT primary_key FROM single_table WHERE some_expr)
9) index_subquery
 与unique_subquery关联类型相似,其子查询使用的是非唯一索引,其形式为:
 value IN (SELECT key_column FROM single_table WHERE some_expr)
10) rang
 只检索给定范围的行。常见于:
 =,<>,>,>=,<,<=,BETWEEN,IN
11) index
 该关联类型与ALL相同,它扫描整个索引树,但通常比ALL要快。
12) ALL
 全表扫描,这是最慢的一种关联类型。
possible_keys 查询中可能用到的索引。这些索引实际中可能并没有用到。如果值是NULL,则表明查询没有用到索引,此时可以检查WHERE子句中哪些列适合加索引以提高查询的性能。
key 查询中实际用到的索引。如果值是NULL,则表明MySQL找不到更有效的索引来执行查询。
key_len 使用到的索引的长度。
ref 使用哪些列或常量可以与索引列一起从表中选择行。
rows MySQL认为执行此查询需要检查的行数。对于InnoDB表来说,这是一个估算值,并不准确。该值越小越好。
filtered 通过条件过滤出的行数的百分比估计值。
Extra 显示MySQL是如何解析查询语句的其它信息。