欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!
在我后台回复 「资料」 可领取
编程高频电子书
!
在我后台回复「面试」可领取硬核面试笔记
!文章导读地址:点击查看文章导读!
感谢你的关注!
详解执行计划 type 列
通过 explain 语句可以帮助我们查看查询语句的具体执行计划,那么在执行计划中的 type 列表示 MySQL 是如何查找对应的数据了,我们先来说一下执行计划中 type 列常见的值
这里主要说一下常见的几种:const、ref、range、index,性能从左到右逐渐变差
- 首先,const 的话表示性能是常量级的,非常快
就比如对于 SQL 语句:select * from table where id = 1
SQL 语句可以通过 聚簇索引
或者 二级唯一索引 + 聚簇索引
的方式,在常量级别的时间内找到我们想要的数据
这里需要注意的是,如果使用的是二级唯一索引的方式,必须保证建立 unique key 唯一索引,来保证二级索引列中的值都是唯一的,比如对于 SQL:select * from table where name = x
,那么就需要保证 name 列的值是唯一的,且 name 列是二级索引
- ref 级别的查询
如果在 SQL 中只使用到了普通的二级索引,如:select * from table where name = x
,name 为普通二级索引,不是唯一索引,那么此时 SQL 的查询级别就是 ref,速度也比较快
如果对聚簇索引或者唯一索引判断是否为 null 值的话,也是 ref 级别的查询,如:select * from table where name is NULL
,如果 name 是聚簇索引(主键索引)或者唯一索引的话,此时查询级别为 ref
- range 级别的查询
使用索引进行范围查询的 SQL,此时就是 range 级别的查询
如:select * from table where age >= 18 and age <= 30
,如果 age 为普通索引,通过 age 进行范围查询,则查询为 range 级别的
- index 级别的查询
看到 index 级别,可能觉得很快,其实不是这样的,index 级别的 SQL 查询性能仅仅比全表扫描要略好一些而已
index 的意思就是,如果有一个 SQL,发现你建立了一个联合索引,这个索引恰好是覆盖索引,因此直接遍历这个联合索引的叶子节点,将要查询的值全部取出来之后,就不需要再去聚簇索引中取值了,这种情况下查询的级别就是 index,性能仅仅比全表扫描要好一些而已
比如说 select account, name, age from table where name = x
,建立的联合索引为(account, name, age),那么发现 where 条件中直接根据 name 判断,不符合最左前缀原则,但是符合覆盖索引,因此 MySQL 判断二级索引大小还是比较小的,因此直接扫描二级索引的全部叶子节点,直接将对应的值给取出来即可