5分钟看SQL的执行计划
一、概述
如果你想优化SQL语句,那么SQL执行计划就是必须要知道的,因为只有通过SQL的执行计划,你才可以知道SQL是如何进行查询的,以及否走索引、用的是什么索引、是否进行了排序又是如何排序的等等信息。
在应用层面其实就是在SQL语句前面加上Explain
,我在前面的文章中有涉及到这个的使用,但是没有细说,今天我们专门来讲一讲这个Explain输出的信息都是什么意思
二、Explain输出的列
列 | 意义 |
---|---|
id | 该SELECT 标识符 |
select_type | 该SELECT 类型 |
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 KEY
或UNIQUE
索引,通俗的说就是使用了唯一索引(获取到的是单行数据),这个算是最快的了 -
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的执行计划,去设计适合业务需求的索引。