explain
命令是用来对sql语句进行分析的一个命令,可以通过此功能来对语句进行优化.其使用方式为
explain <sql语句>
,例如explain select * fom Order;
执行后的返回值如下:
其中,每列的含义如下:
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明
每项的具体内容如下:
id
索引的执行顺序,值越大越先执行,值相同时按照从上到下顺序执行.一般在子查询时有意义,其会返回多行数据,越里面的查询值越大.
select_type
简单的SELECT语句,不包括UNION(连接两个select结果集的关键字)操作或子查询操作.
table
当前操作的表名
partitions
无
type
type所显示的是查询使用了哪种类型,其内心如下所示按快到慢排序:
- const:常量查询,即查询的值和where的值都是同一个,且为唯一索引,这个时候扫描为直接匹配命中,其操作就类似于拿一个变量的值,速度极快.
- ref:使用非唯一索引,对索引值的完全搜索,即若有多个索引值,这些索引值需要都在where中.
- range:只检索给定范围的行.即对索引字段进行范围查询,可以为
>
<
等匹配符号,也可以为between
关键字,查询字段可以索引或非索引字段.- index: 通过索引匹配得到主键索引值,索引值为部分索引,此时会遍历索引树,然后回表查询得到数据.
- all:无索引遍历整个表.
possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
Key
在查询时实际上使用到的索引名,必然包含在possible_keys中.
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
表示索引中使用的字节数,可通过该列计算查询中实际使用到的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
ref
显示索引的哪一列被使用了,如果可能的话,最好是一个常数。哪些列或常量被用于查找索引列上的值。
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好.
filtered
Extra
包含不适合在其他列中显式但十分重要的额外信息
- Using temporary
使用了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。- Using index
表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作,例如按索引树顺序读取索引值,type一般为index。- Using where
表明使用了where过滤- Using join buffer
表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。- impossible where
where子句的值总是false,不能用来获取任何元组,例如where a>1 and a<0
- select tables optimized away
在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化- distinct
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作.
网友评论