执行计划是指一条SQL语句经过MySQL查询优化器的优化后,具体的执行方式。
通过查看explain的结果,可以了解到数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行被查询等信息。
explain
执行计划支持select
、update
、insert
、replace
以及update
语句,一般多用于分析select查询语句,语法如下:
EXPLAIN + SELECT 查询语句;
查询语句的执行计划示例:
mysql> explain SELECT * FROM dept_emp WHERE emp_no IN (SELECT emp_no FROM dept_emp GROUP BY emp_no HAVING COUNT(emp_no)>1);
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
| 1 | PRIMARY | dept_emp | NULL | ALL | NULL | NULL | NULL | NULL | 331143 | 100.00 | Using where |
| 2 | SUBQUERY | dept_emp | NULL | index | PRIMARY,dept_no | PRIMARY | 16 | NULL | 331143 | 100.00 | Using index |
+----+-------------+----------+------------+-------+-----------------+---------+---------+------+--------+----------+-------------+
执行计划结构中共有12列,各列代表的含义总结如下标:
列名 | 含义 |
id select_type table partitions type possible_keys key key_len ref rows filtered Extra | SELECT查询的序列标识符(值越大,优先级越高 SELECT关键字对应的查询类型 所查的表名 匹配的分区,对于未分区的表,值为null 表内数据的访问方式 可能用到的索引 实际用到的索引 所选索引的字段长度 当使用索引等值查询时,与索引作比较的列或常量 预计要读取的行数 按表条件过滤后,留存的记录数的百分比 附件信息补充 |
具体字段含义分析:
id
SELECT标识符,是查询中SELECT的序号,其排列顺序代表整个查询中SELECT语句的执行顺序,值越高优先级越高。
select_type
标识查询的类型,主要用于区分该条SELECT语句所属的类别,如普通查询、联合查询、子查询等,常见的值如下:
- SIMPLE:简单查询,不包含UNION或者子查询。
- PRIMARY:查询中如果包含子查询或其他部分,则外层SELECT将被标记为PRIMARY。
- SUBQUERY:子查询中的第一个SELECT
- UNION:在UNION语句中,UNION之后出现的SELECT。
- DERIVED:在FROM中出现的子查询被标记为DERIVED
- UNION RESULT:UNION查询的结果
table
所查询的表名,表名除了正常的数据库表名以为,也可能是以下列出的值:
- <unionM,N> : 本行引用了 id 为 M 和 N 的行的 UNION 结果;
- <derivedN> : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。
- <subqueryN> : 本行引用了 id 为 N 的表所产生的的物化子查询结果。
type(重要)
查询表内数据的方式,描述了查询具体数据是如何执行的,其中按照性能从高到底依次为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。
常见的几种类型具体含义如下:
- system:如果表使用的引擎对于表行数统计是精确的(如:MyISAM),且表中只有一行记录的情况下,访问方法是 system ,是 const 的一种特例。
- const:根据主键或者唯一索引查询,索引值是常量值时。explain select * from emp where empno=7369;
- eq_ref:根据主键或者唯一性索引查询。索引值不是常量值。
- ref:使用了非唯一的索引进行查询。
- range:使用了索引,扫描了索引树的一部分。
- index:表示用了索引,但是也需要遍历整个索引树。
- all:全表扫描
possible_keys
该查询可能会用到的索引
key
实际用到的索引
key_len
查询过程中所用到的索引列占的总字节数
rows
查询扫描的预估计行数
Extra
与查询相关的额外信息和说明
常见的值如下:
- Using filesort:在排序时使用了外部的索引排序,没有用到表内索引进行排序。
- Using temporary:MySQL 需要创建临时表来存储查询的结果,常见于 ORDER BY 和 GROUP BY。
- Using index:表明查询使用了覆盖索引,不用回表,查询效率非常高。
- Using index condition:表示查询优化器选择使用了索引条件下推这个特性。
- Using where:表明查询使用了 WHERE 子句进行条件过滤。一般在没有使用到索引的时候会出现。