id
查询语句中每出现一个select关键字,mysql就会为它分配一个唯一的ID值,某些子查询会被优化成join查询,那么出现的id会一样
id列的值代表了select的执行顺序,id值大优先执行,id值空最后执行,id值相同从上到下执行
select_type
select关键字对应的那个查询的类型
- simple
简单查询,不含子查询或join关键字 - primary
复杂查询最外层select语句或者union语句中最左边的select - subquery
子查询,仅限在from前面的select语句 - MATERIALIZED
materialized表示where后面in条件的子查询
这个表示产生的结果会生成一张表(物化为临时表,存在内存中),并且会给这张表创建一个唯一索引 - derived
不用关注,衍生查询,from语句后面包含select语句,则会产生这种类型,会把中间结果放到临时表中
5.7及以后合并优化了,需要用set session optimizer_switch='derived_merge=off'关闭。 - union
联合查询
还会产生一行(id=null, select_type=UNION_RESULT, table=<union id1,id2,...>)的
table
表名
partitions
匹配的分区信息
type
针对单表的查询方式(全表扫描、索引)
NULL>system>const>eq_ref>ref>range>index>ALL
执行效率依次递减
-
NULL
代表查询在mysql优化阶段分解查询语句的时候能直接完成,不需要查询表和索引
比如获取表最大id,最小id,此时Extra=‘Select tables optimized away’ -
system
达到该级别需要满足- 是系统表或者是临时表
- 表中有且只有一条数据
-
const
当where条件后面是一个主键或唯一性索引,与一个常量精确比较时,mysql会把查询优化成一个常量查询 -
eq_ref
主键或唯一索引与其他表或字段进行关联查询,最多只会返回一条记录 -
ref
普通索引或者联合索引的前缀匹配 -
range
范围索引,通常为in、> < >= 这些 -
index
扫描全表索引:所查询的列都创建了索引,但是没有按照索引字段过滤 -
ALL
全表扫描
possible_keys
可能用到的索引
如果该列为null,表示没有相关索引
如果该列有索引,但是key没索引,表示mysql认为索引对此查询帮助不大,选择了全表查询
key
实际上使用的索引
key_len
实际使用的到的索引长度
一般用来判断联合索引是否全部生效
ref
当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows
预估的需要读取的记录条数,扫描了多少行
filtered
某个表经过搜索条件过滤后剩余记录条数的百分比,(最终记录数量/扫描记录数量)*100%
Extra
一些额外信息,排序等
-
using index
查询的字段被索引覆盖 -
Using index condition
前导列查询
会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行 -
using where
where 后面的字段没有使用索引,没有创建索引
考虑是否通过创建索引优化 -
Using temporary
创建临时表,查询过程中需要创建临时表辅助查询
需要优化 -
Using filesort
数据排序的时候没有通过索引排序,数据量小通过内存排序,数据量大在磁盘中排序
需要进行优化 -
Select tables optimized away
直接从表信息就获取到结果
网友评论