• Explain / Desc 执行计划分析


    简单说明

    在MySQL中,explaindesc都可以生成优化器关于SQL执行的信息,因此无论用哪一个,结果都是一样的,本文只用desc进行说明。

    下面是一条查询语句以及对应的SQL执行计划:

    在这里插入图片描述

    在这里插入图片描述
    由图可知,该SQL执行计划展示了12个元素信息。

    id

    第一个是id,表示select语句操作表的执行顺序。
    其中id的值越大,表示优先级越高。
    id相同时,一般从上至下的顺序执行,但具体由优化器决定。
    id不同时,可能出现嵌套的子查询,子查询优先级更高,先执行。

    select_type

    第二个是select_type,区分不同的查询类型,包括SIMPLEPRIMARY
    SUBQUERYDERIVEDUNIONUNION RESULT

    SIMPLE--最简单的查询,不包括子查询和交并集。
    
    PRIMARY--包含子部分,最外层的就是PRIMARY。
    
    SUBQUERY-- select 或 where 包含子查询
    
    DERIVED--  from 后的子查询; 若UNION在from后面,最外层的是DERIVED
    
    UNION--  union后面的select语句是UNION
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    table

    第三个表示的是表名。
    也可能是临时表、表的别名。

    partitions

    第四个表示查询表的分区信息。

    如果没有分区,就是 null
    有分区,则显示分区情况
    
    • 1
    • 2

    type

    第五个显示查询的类型,体现了性能的差异。

    SQL优化的性能从好到坏依次如下:
    system  > const > eq_ref > ref  > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
    
    • 1
    • 2

    1)system:表内只有一行记录,数据量很少,不需要磁盘IO

    2)const:查询时命中主键或命中唯一索引或命中一个常量值。该最多一个匹配行。

    3)eq_ref:与const用法一样。区别在于eq_ref用于联表查询(组成的一行)。

    4)ref:与eq_ref相比,可以使用非唯一索引,会返回多行查询结果。

    5)ref_or_null:与ref相比,查询结果返回包含null的值。

    6)index_merge:索引合并优化,查询时使用两个以上的索引。

    7)unique_subquery:替换IN子查询,子查询返回不重复的值。

    8)index_subquery:区别于unique_subquery,用于非唯一索引,能返回重复值。

    9)range:针对索引字段,查询给定范围的行。一般是where后跟的bettween...and、<、>、<=、in 等条件查询

    10)index:遍历索引树,全表扫描。

    11)all:从硬盘中读取,全表扫描。

    possible_keys

    第六个表示该字段所含的所有索引都会被列出来,但最终不一定会走这些索引。

    key

    第七个表示实际使用的索引。

    key_len

    第八个表示查询使用的索引长度(单位是字节),越短性能越好。

    只计算 where 条件列的索引长度,排序和分组语句的索引不会计算在内。
    
    • 1

    ref

    第九个表示索引被使用的列。

    当使用常量等值查询,显示const,
    当关联查询时,会显示相应关联表的关联字段
    如果查询条件使用了表达式、函数,或者条件列发生内部隐式转换,可能显示为func
    其他情况则显示 null
    
    • 1
    • 2
    • 3
    • 4

    rows

    第十个表示,系统估算查找到所需结果应读取的行数。
    该值越小,性能越好。

    filtered

    第十一个表示,表中满足条件的记录数据所占百分比。

    Extra

    第十二个表示不能在前十一个列显示的其他信息。

    1)Using index:使用了覆盖索引。

    2)Using where:查询未走索引,通过where条件匹配相应的结果集。

    3)Using temporary:查询的结果用临时表存储,一般是排序或分组。

    4)Using filesort:无法用索引完成排序操作,ORDER BY字段没有索引,需要优化。

    5)Impossible where:由于不正确的where语句,找不到所需的结果。

    6)No tables used:没有from语句。

  • 相关阅读:
    (02)Cartographer源码无死角解析-(33) LocalTrajectoryBuilder2D: 点云数据流向、处理、消息发布等→流程复盘
    【计算机视觉 | 目标检测】干货:目标检测常见算法介绍合集(一)
    OpenCV——总结《车牌识别》
    固定资产管理系统对企业的意义?
    Open3D(C++) ICP算法实现点云精配准
    03、主动信息收集
    Nginx篇---第三篇
    springcloud五大组件:Eureka:注册中心、Zuul:服务网关、Ribbon:负载均衡、Feign:服务调用、Hystix:熔断器
    leetcode算法-哈希表总结
    FIX三天日记-quick fix源码
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/126088387