美文网首页
Explain语句结果中各个字段分别表示些什么

Explain语句结果中各个字段分别表示些什么

作者: 东南枝下 | 来源:发表于2022-12-27 17:34 被阅读0次

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
    达到该级别需要满足

    1. 是系统表或者是临时表
    2. 表中有且只有一条数据
  • 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
    直接从表信息就获取到结果

相关文章

网友评论

      本文标题:Explain语句结果中各个字段分别表示些什么

      本文链接:https://www.haomeiwen.com/subject/fxinqdtx.html