Mysql Explain

Mysql Explain

描述

查看sql语句的执行计划,从中找出待优化的地方

字段详解

执行explain后会得到如下一个结果
在这里插入图片描述
涉及的字段:id,select_type,table,tyoe,possible_keys,key,key_len,ref,rows,Extra
字段详解:

  • id
    Select查询的序列号,是一串数字,执行select字句或操作表的顺序
    分三种情况:
    • Id相同;加载表顺序从上到下
    • Id不同;id越大优先级越高,越先被执行
    • Id有相同,也有不同,同时存在;id相同的,认为同一组,不同组之间比较时,根据大小,越大优先级越高;相同组,从上到下
  • Select_type
    显示本次select类型,其中类型有:
    • Simple,简单查询,不包含子查询以及union
    • Subquery,子查询中第一个select语句
    • Derived,派生表,临时表,由子查询派生出来,位于from中的子查询
    • Union,位于union中第二个及其以后的子查询被标记为union,第一个被标记为primary,如果union为与from中则被标记为derived
    • Union result,用来从匿名临时表中检索结果的select被标记为union result
    • Dependent union
    • Dependent subquery
  • Table
    访问类型,重要指标,结果从好到坏依次是:
    System > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all,一般来说,至少得保证访问类型级别在range以上,最好能达到ref。
    类型说明:
    • All,最坏的情况,全表扫描,扫描数据行
    • Index,与all一样,区别是index扫描索引树,以下两种情况会触发
    • 索引是查询的覆盖索引,就是说索引查询的数据满足了查询中所需的所有数据,只扫描索引树,不进行回表查询。此时Extra列显示的是using index
    • 全表扫描按照索引的顺序查找数据行。
      总结:上述1,2的区别在于是否需要回表操作~
    • Range,索引范围查找。Ref列为null

    • Index_subquery,使用in的子查询,子查询结果给父查询的非唯一索引查询使用

    • Unique_subquery,与index_subquery类似,区别在于父查询的查询条件为其唯一索引

    • Index_merge,一个查询中很多索引被用到时,可能会触发index_merge的优化机制

    • Ref_or_null,与ref类似,但是会多一个查询,来看哪些行包含了null

    • Fulltext,全文索引

    • Ref,触发联合索引最左前缀或索引不是主键或索引不是唯一索引,即查询结果多于一行

    • Eq_ref,只匹配到一行的时候,一般使用唯一索引查找或主键查找时发生

    • Const,最多只有一行匹配,使用主键或唯一索引的时候

    • System,表只有一行,一个const type的特殊类型
      总结:system以及const两种类型差不多,当级别为all以及index的时候,就得进行相应的优化。

    • Possible_keys
      可能使用的索引
    • Key
      Mysql实际决定使用的索引
    • Key_len
      Mysql使用的键长度,不失精度的情况下,长度越短越好
    • Ref
      显示哪个列或常数与key一起从表中选择行
    • Rows
      执行查询时,检查的行数。这是一个预估值
    • Extra
      显示mysql查询过程中的一些详细信息以及对查询计划的一些重要补充信息。
      类型:
    • Using file sort。Mysql两种排序方式,文件排序以及索引排序,此处表明进行的排序操作为文件排序
  • Using temporary。Mysql使用临时表存储结果集
  • Not exists。
  • Using index。查询覆盖了索引,不需要回表读取数据文件。
  • Using where。
  • Using join buffer。
  • Impossible where。Where子句值总是false,不能获取任何元组
  • Select tables optimized away。
  • Distinct。优化distinct操作

其他

关于排序
两种方式:

  • 通过有序索引
    索引结构为B+树,已经是有序的结构。Explain 分析时,显示为using index
  • 通过filesort
    进行了额外的排序操作。Explain 分析时using filesort
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值