explain主要用于sql语句中的select查询,可以显示的查看该sql语句索引的命中情况,从而更好的利用索引、优化查询效率。
Explain语法如下:explain [extended] select ...
其中extended是选用的,如果使用的extended,那么explain之后就可以使用show warnings查看相应的优化信息,也就是mysql内部实际执行的query。
列名
描述
说明
相关链接
id
若没有子查询和联合查询,id则都是1。
Mysql会按照id从大到小的顺序执行query,在id相同的情况下,则从上到下执行。
select_type
select类型。
table
输出的行所引用的表。
有时看到的是<derivedN>,其中N对应的是id列的值。
type
Mysql的存取方法,连接访问类型。
possible_keys
在查询过程中可能用到的索引。
在优化初期创建该列,但在以后的优化过程中会根据实际情况进行选择,所以在该列列出的索引在后续过程中可能没用。该列为NULL意味着没有相关索引,可以根据实际情况看是否需要加索引。
key
访问过程中实际用到的索引。
有可能不会出现在possible_keys中(这时可能用的是覆盖索引,即使query中没有where)。possible_keys揭示哪个索引更有效,key是优化器决定哪个索引可能最小化查询成本,查询成本基于系统开销等总和因素,有可能是“执行时间”矛盾。如果强制mysql使用或者忽略possible_keys中的索引,需要在query中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
显示使用索引的字节数。
由根据表结构计算得出,而不是实际数据的字节数。如ColumnA(char(3)) ColumnB(int(11)),在utf-8的字符集下,key_len=3*3+4=13。计算该值时需要考虑字符列对应的字符集,不同字符集对应不同的字节数。
ref
显示了哪些字段或者常量被用来和 key 配合从表中查询记录出来。显示那些在index查询中被当作值使用的在其他表里的字段或者constants。
rows
估计为返回结果集而需要扫描的行。
不是最终结果集的函数,把所有的rows乘起来可估算出整个query需要检查的行数。有limit时会不准确。(为毛?)
Extra
mysql查询的附加信息。
select类型:
simple:query中不包含子查询或联合查询。
primary:包含子查询或联合查询的query中,最外层的select查询。
subquery:子查询在select的目标里,不在from中,子查询的第一个select。
例如:EXPLAIN SELECT (SELECT actor_id FROM actor) FROM film_actor
dependent subquery:子查询内层的第一个select,依赖于外部查询的结果集。
例如:EXPLAIN SELECT * FROM actor WHERE actor_id IN (SELECT actor_id FROM film_actor)
EXPLAIN SELECT * FROM actor WHERE actor_id IN (SELECT actor_id FROM film_actor WHERE actor_id=1)
EXPLAIN SELECT * FROM actor WHERE actor_id = (SELECT actor_id FROM film_actor WHERE actor_id=1)
uncacheable subquery:表示子查询,但返回结果不能被cache,必须依据外层查询重新计算。(在什么情况下会出现这个?)
derived:子查询在from子句中,执行查询的时候会把子查询的结果集放到临时表(衍生表)。
例如:EXPLAIN SELECT * FROM (SELECT * FROM actor) AS a。此时table列会显示<derivedN>,其中N对应id列的值。
union:在联合查询中第二个及其以后的select对应的类型。
例如:EXPLAIN SELECT * FROM film_actor UNION ALL SELECT * FROM actor
如果union包含在一个from子查询里面,则from子查询中的第一个select标记为derived。
例如:EXPLAIN SELECT * FROM ( SELECT * FROM film_actor UNION ALL SELECT * FROM actor) a