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类型。
|
|
[url=http://www.1sucai.cn/article/29769.htm#select_type%E5%B8%B8%E8%A7%81%E7%B1%BB%E5%9E%8B]常见类型[/url]
|
|
table
|
输出的行所引用的表。
|
有时看到的是<derivedN>,其中N对应的是id列的值。
|
|
|
type
|
Mysql的存取方法,连接访问类型。
|
|
[url=http://www.1sucai.cn/article/29769.htm#type%E5%B8%B8%E8%A7%81%E7%B1%BB%E5%9E%8B]常见类型[/url]
|
|
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。计算该值时需要考虑字符列对应的字符集,不同字符集对应不同的字节数。
|
[url=http://www.1sucai.cn/article/29769.htm#%E5%AD%97%E7%AC%A6%E9%9B%86%E5%92%8C%E5%AD%97%E8%8A%82%E7%9A%84%E5%85%B3%E7%B3%BB]mysql5.1.5下latin1、utf8、gbk字符数、字节数、汉字的对应关系[/url]
|
|
ref
|
显示了哪些字段或者常量被用来和 [code]key[/code] 配合从表中查询记录出来。显示那些在index查询中被当作值使用的在其他表里的字段或者constants。
|
|
|
|
rows
|
估计为返回结果集而需要扫描的行。
|
不是最终结果集的函数,把所有的rows乘起来可估算出整个query需要检查的行数。有limit时会不准确。(为毛?)
|
|
|
Extra
|
mysql查询的附加信息。
|
|
[url=http://www.1sucai.cn/article/29769.htm#extra%E5%B8%B8%E8%A7%81%E4%BF%A1%E6%81%AF]常见信息[/url]
|
select类型:
simple:query中不包含子查询或联合查询。
primary:包含子查询或联合查询的query中,最外层的select查询。
subquery:子查询在select的目标里,不在from中,子查询的第一个select。
例如:EXPLAIN SELECT (SELECT actor_id FROM actor) FROM film_actor
[img]http://files.jb51.net/file_images/article/201202/image001.jpg[/img]
dependent subquery:子查询内层的第一个select,依赖于外部查询的结果集。
例如:EXPLAIN SELECT * FROM actor WHERE actor_id IN (SELECT actor_id FROM film_actor)
[img]http://files.jb51.net/file_images/article/201202/image002.jpg[/img]
EXPLAIN SELECT * FROM actor WHERE actor_id IN (SELECT actor_id FROM film_actor WHERE actor_id=1)
[img]http://files.jb51.net/file_images/article/201202/image003.jpg[/img]
EXPLAIN SELECT * FROM actor WHERE actor_id = (SELECT actor_id FROM film_actor WHERE actor_id=1)
[img]http://files.jb51.net/file_images/article/201202/image004.jpg[/img]
uncacheable subquery:表示子查询,但返回结果不能被cache,必须依据外层查询重新计算。(在什么情况下会出现这个?)
derived:子查询在from子句中,执行查询的时候会把子查询的结果集放到临时表(衍生表)。
例如:EXPLAIN SELECT * FROM (SELECT * FROM actor) AS a。此时table列会显示<derivedN>,其中N对应id列的值。
[img]http://files.jb51.net/file_images/article/201202/image005.jpg[/img]
union:在联合查询中第二个及其以后的select对应的类型。
例如:EXPLAIN SELECT * FROM film_actor UNION ALL SELECT * FROM actor
[img]http://files.jb51.net/file_images/article/201202/image006.jpg[/img]
如果union包含在一个from子查询里面,则from子查询中的第一个select标记为derived。
例如:EXPLAIN SELECT * FROM ( SELECT * FROM film_actor UNION ALL SELECT * FROM actor) a
[img]http://files.jb51.net/file_images/article/201202/image007.jpg[/img]
union result:从union临时表获取结果集合。例如上面两个查询结果集中的最后一行。<union1,2,...>其中1,2,...所标识的id列表代表id列,当id列表长度超过20个之后就会省略后面的<union1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,...>。例子如上图。
dependent union:子查询中的union,且为union中第二个select开始的后面所有select,同样依赖于外部查询的结果集。
例如:EXPLAIN SELECT * FROM actor WHERE actor_id IN (SELECT actor_id FROM film_actor UNION ALL SELECT actor_id FROM film_actor)
[img]http://files.jb51.net/file_images/article/201202/image008.jpg[/img]
uncacheable union:表示union第二个或以后的select,但结果不能被cache,必须依据外层查询重新计算。(在什么情况下会出现)
按照效率从高到低[url=http://xiazai.jb51.net/201202/books/mysql_explain.rar]word版打包下载[/url]