mysql总结之explain

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

mysql总结之explain

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8232a6c7be992f40aba765facee8cd37.html