说明
explain命令是查看查询优化器如何决定执行查询的主要方法.
调用方式
explain select * from table (mysql5.6开始支持 update等 非select操作)
会显示下图的数据,列是固定的.
列说明
id列
编号,标识select所属的行. 如果语句中没有子查询,关联表查询,那么只会有唯一的select,每一行在这个列都显示 1 , 否则 select语句一般会顺序编号,对应其在原始语句中的位置.
select_type列
select_type 查询类型 | 说明 |
---|---|
SIMPLE | 简单的 select 查询,不使用 union 及子查询 |
PRIMARY | 最外层的 select 查询 |
UNION | UNION 中的第二个或随后的 select 查询,不依赖于外部查询的结果集 |
DEPENDENT UNION | UNION 中的第二个或随后的 select 查询,依赖于外部查询的结果集 |
SUBQUERY | 子查询中的第一个 select 查询,不依赖于外 部查询的结果集 |
DEPENDENT SUBQUERY | 子查询中的第一个 select 查询,依赖于外部 查询的结果集 |
DERIVED | 用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里 |
UNCACHEABLE SUBQUERY | 结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估 |
UNCACHEABLE UNION | UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询 |
table 列
输出行所引用的表名或者别名
type 列
All
从头到尾,全表扫描
index
跟全表扫描一样,不过mysql扫描是按照的索引顺序而不是行顺序(非自然排序),通常情况会按照索引顺序访问行,产生随机行文本,开销很大,可以避免排序.
如果在extra列中看到 using index ,说明 正在使用覆盖索引,只扫描索引的数据,而不是行数据,开销会小很多
range
范围扫描就是一个有限制的索引扫描.
只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range。
ref
索引访问,查找和扫描的混合体. where条件的查找使用索引就是最明显的例子.
eq_ref , const , system
索引访问,mysql最多返回一条数据,多用于唯一索引查找
null
优化过程中就已经得到结果,不在访问表或索引
possible_keys 列
这一列显示了mysql可以使用哪些索引
key 列
mysql决定采用哪个索引来对表进行访问,有可能索引并不是在 possible_keys 列中
例如选择了覆盖索引
ken_len 列
显示mysql在索引字段中可能的最大长度,而不是表中数据使用的实际字节数.
ref 列
显示索引的哪一列被使用了
rows 列
mysql 估计为了找到所需要的数据而读取的行数,某些时候可以用来获取大概值,比如统计在线人数,不需要很精确的情况下.
filtered 列
mysql5.1里新加的,使用explain extended 时出现.
所显示的是表里面某个条件的记录数的百分比所作的悲观估算
extra 列
常见如下:
using index
表示mysql使用覆盖索引,避免访问表.
using where
表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。因为检查是在读取行后才进行的,所以称为“后过滤”。
using temporary
使用到临时表
using filesort
若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort 。