一文详解MySQL中explain关键字

2021-10-21 10:46:18  晓掌柜  版权声明:本文为站长原创文章,转载请写明出处


一、前言

    无论是在进行MySQL语句编写亦或是线上慢sql分析时,我们都会用到explain关键字对当前sql执行计划的分析,找出是否有使用到索引、是否进行了全表扫描等。但是你对explain关键字有一个系统的认识吗?不要慌,今天我们就一起对MySQL中explain关键字做一个系统的解析。跟着我的节奏 - 冲!


二、explain的组成

    我们使用explain进行一个简单的sql分析,可以看到如下结果:

    

    通过上图我们可以发现,返回结果由12个部分组成,他们分别是:

    ① id:查询编号

    ② select_type:查询类型

    ③ table:查询数据表

    ④ partitions:数据分区信息(一般可忽略)

    ⑤ type:关联类型

    ⑥ possible_keys:可以使用那些索引

    ⑦ key:实际使用到的索引

    ⑧ key_len:索引字段的最大长度

    ⑨ ref:索引的实际关联字段

    ⑩ rows:查询数据实际读取的条目数

    ⑪ filtered:符合条件的条目数占总数的百分比

    ⑫ Extra:解析查询附加的额外信息


三、各部分详解

    3.1、id

        我们可以理解为这个查询的执行顺序,id的数值越大就越先被执行。我们可以细分一下情况:

        ① id相同时,我们可以认为是在同一组,执行顺序由上而下

        ② 如果是子查询,id的数值会递增,数值越大优先级越高

        ③ 在所有的组中,id的数值越大,优先级越高也就越先被执行

        

    3.2、select_type

        关联类型,也代表这查询数据表的方式。主要包含如下:

        

    3.3、table

        sql查询中涉及的数据表的名称,需要注意的是,有时可能是别名,如上面的a、b,有时也可能是一个执行结果集。

    3.4、partitions

        数据的分区信息,没有分区忽略就好了。

    3.5、type

        数据表的访问方式,主要有:

        ALL、index、range、ref_or_null、fulltext、ref、eq_ref、const、system(从左到右,性能越来越好)

        all

            全表查询,需要扫描所有的数据才能找到匹配行

        index

            这个和全表扫描类似,只是在查询的时候使用到了索引

        rang

            范围查询,本质上是带有条件的索引查询,日常的 >、<、in、between都会产生范围查询

            

        ref_or_null

            和ref类似,但是还要进行一次查询找到NULL的数据。

        fulltext

            使用FULLTEXT索引

        ref

            通过索引查询

            

        eq_ref

            类似ref,区别在于使用了唯一索引,其结果值唯一。ref可以返回多条数据,er_ref仅有一条。

            

        const、system

            const和system是对sql查询进行了内部优化,最终转换成了常量查询,比如上面图片中的子查询被优化成 id = 1

    3.6、possible_keys

        表名MySQL在查询时能使用哪一个索引找到记录值,在查询中有涉及到索引就会给出展示索引名称,为null时则代表没有相关索引。

    3.7、key

        实际决定使用到的索引,这个是必然包含在possible_key中的。

    3.8、key_len

        索引可能的最大长度,需要注意的是这个数值是根据表结构计算出来的,不代表实际值!同时这个数值越小越好。

    3.9、ref

        列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

    3.10、rows

        查询数据需要读取的行数。需要注意的是这只是一个估算值,同样越小越好

    3.11、filtered

        5.1版本之后新增字段,表示针对符合查询条件的记录数的百分比估算,用rows和filtered相乘可以计算出关联表的行数。

    3.12、Extra

        解析查询的附加信息,也可以理解为查询的额外说明,主要有以下几种情况:

        ① Using index:使用索引进行覆盖

        ② Using index condition:使用索引下推,索引下推简单来说就是加上了条件筛选,减少了回表的操作

        ③ Using temporary:排序使用了临时表

        ④ Using filesort: 使用外部索引文件排序,但是不能从这里看出是内存还是磁盘排序,我们只能知道更消耗性能。

        ⑤ Using where:使用where条件进行了查询过滤


四、总结

    ① explain仅针对sql语句分析

    ② 部分统计信息是估算的,并非精确值

    ③ 通过收集统计信息不可能存在结果    

    


最新评论: