Mysql explain

来源:互联网 发布:伊朗f313知乎 编辑:程序博客网 时间:2024/06/07 17:49

说明

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 。

0 0
原创粉丝点击