MySQL进阶之路(二十)—— 5分钟看懂SQL的执行计划

5分钟看SQL的执行计划

一、概述

​ 如果你想优化SQL语句,那么SQL执行计划就是必须要知道的,因为只有通过SQL的执行计划,你才可以知道SQL是如何进行查询的,以及否走索引、用的是什么索引、是否进行了排序又是如何排序的等等信息。

​ 在应用层面其实就是在SQL语句前面加上Explain,我在前面的文章中有涉及到这个的使用,但是没有细说,今天我们专门来讲一讲这个Explain输出的信息都是什么意思

二、Explain输出的列

意义
idSELECT标识符
select_typeSELECT类型
table输出行的表
partitions匹配的分区
type联接类型
possible_keys可供选择的可能索引
key实际选择的索引
key_len所选密钥的长度
ref与索引比较的列
rows要检查的行的估计
filtered按表条件过滤的行百分比
Extra附加信息
举例

这里为了大家能够理解,我举一个例子:

请添加图片描述

第二列的select_type,这里的SIMPLE表示简单查询,也就是说没有使用UNION或者子查询

第四列的type很重要,可以通过这个判断SQL的执行速度以及是否使用索引和使用的是什么索引

第五列的possible_keys顾名思义,也就是对于此次查询可供选择的key

第六列的key就是真正使用的索引,在这个例子中使用的是PRIMARY主键索引

第七列的key_len也就是使用的键的长度

第八列的ref表示的是和索引比较的列是如何使用索引的(因为一个查询的where条件中可能使用到多个索引)

三、根据type分析使用的索引

type列最常见的值有如下几种:

  • const

    使用PRIMARY KEYUNIQUE索引,通俗的说就是使用了唯一索引(获取到的是单行数据),这个算是最快的了

  • ref

    要比const慢一些,使用的不是唯一索引(获取到的可能有多行数据),比如仅仅使用了键的最左前缀键或者普通索引

    例子:

请添加图片描述

可以通过row这一列看到,查询出来了2条数据

  • ref or null

    与ref有点类似,不一样的是MySQL会额外去搜索有NULL值的行

    例子:

请添加图片描述

在使用普通索引的时候还加上了 IS NULL 这一条件

注意:普通索引的这个字段在设计表结构的时候没有设置IS NOT NULL

  • index

    这个表示只是遍历了二级索引,也就是没有进行回表查询,就是之前文章说过的索引覆盖

请添加图片描述

注:如果使用二级索引进行全表扫描

  • range

    这个很简单,其实就是范围查询

  • all

    这个其实没什么好说的,其实就是全表扫描,是最慢的那一种

四、小结

  • range

    这个很简单,其实就是范围查询

  • all

    这个其实没什么好说的,其实就是全表扫描,是最慢的那一种

四、小结

​ 其实对于我们优化SQL,尤其是查询语句,其实最核心的就是希望尽可能的使用到索引,尽可能少的全表扫描,为了知道SQL是否使用到了索引,我们需要去查看执行计划,,因此本篇文章才会特别关心type列输出的内容。通过Explain观察SQL的执行计划,去设计适合业务需求的索引。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生命中有太多不确定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值