【MySQL进阶之路】详解执行计划 type 列

欢迎关注公众号(通过文章导读关注:【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 列是二级索引

【MySQL进阶之路】详解执行计划 type 列_第1张图片

  • ref 级别的查询

如果在 SQL 中只使用到了普通的二级索引,如:select * from table where name = x ,name 为普通二级索引,不是唯一索引,那么此时 SQL 的查询级别就是 ref,速度也比较快

如果对聚簇索引或者唯一索引判断是否为 null 值的话,也是 ref 级别的查询,如:select * from table where name is NULL ,如果 name 是聚簇索引(主键索引)或者唯一索引的话,此时查询级别为 ref

【MySQL进阶之路】详解执行计划 type 列_第2张图片

  • 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 判断二级索引大小还是比较小的,因此直接扫描二级索引的全部叶子节点,直接将对应的值给取出来即可

【MySQL进阶之路】详解执行计划 type 列_第3张图片

你可能感兴趣的:(MySQL进阶之路,mysql,数据库)