17.MySql 联合索引 左前缀法则和范围查询

我们之前已经给tb_user 添加了索引 show index from tb_user;

左前缀法则

在 tb_user 表中,有一个联合索引,这个联合索引涉及到三个字段,顺序分别为:profession, age,status。

对于最左前缀法则指的是,查询时,最左边 的列,也就是profession必须存在(最左边列存在就行不管顺序如何),否则索引全部失效。而且中间不能跳过某一列,否则该列后面的字段索引将失效。 接下来,我们来演示几组案例,看一下具体的执行计划:

A. profession age status全部存在key_len 是54

ini 复制代码
explain
select *
from tb_user
where profession = '软件工程'
  and age = 31
  and status = '0';

B.我们将status条件删除 key_len 是49 代表status长度是5

csharp 复制代码
explain select * from tb_user where profession = '软件工程' and age = 31;

C.单独查询 profession 长度是47 status长度是5 age索引长度是2

csharp 复制代码
explain select * from tb_user where profession = '软件工程';

D.删除profession 查询条件

csharp 复制代码
explain select * from tb_user where age = 31 and status = '0';

explain select * from tb_user where status = '0';

而通过上面的这两组测试,我们也可以看到索引并未生效,原因是因为不满足最左前缀法则,联合索引最左边的列profession不存在

E.删除age

csharp 复制代码
explain select * from tb_user where profession = '软件工程' and status = '0 ';

从key_len长度47判断出来 跳过了age这个列,所以后面的列索引是不会使用的,也就是索引部分生效,所以索引的长度就是47

F.当查询条件索引顺序被打乱 是否满足最左前缀法则,走不走上述的联合索引

csharp 复制代码
explain select * from tb_user where age = 31 and status = '0' and profession = '软件工程';

最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段(即是第一个字段)必须存在,与我们编写SQL时,条件编写的先后顺序无关。

范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。

csharp 复制代码
explain select * from tb_user where profession = '软件工程' and age > 30 and status= '0';

当范围查询使用> 或 < 时,走联合索引了,但是索引的长度为49,就说明范围查询右边的status字段是没有走索引的。

csharp 复制代码
explain select * from tb_user where profession = '软件工程' and age >= 30 and status = '0 ';

当范围查询使用>= 或 <= 时,走联合索引了,但是索引的长度为54,就说明所有的字段都是走索引的。

所以,在业务允许的情况下 ,尽可能的使用类似于 >= 或 <= 这类的范围查询,而避免使用 > 或 <

相关推荐
AIgorithmGEEK3 小时前
MySQL 索引全解(下):建、查、删实战与知识速查表
数据库·mysql·b+树·索引
Lost_the_wind3 小时前
MySQL学习笔记四
mysql
geovindu7 小时前
sql:Search-Optimized SQL Queries using mysql 9.0
android·数据库·sql·mysql·数据库开发·数据库架构
for_ever_love__7 小时前
MySQL SELECT 与 WHERE 优化实战:可搜索条件、联合索引与执行计划
数据库·mysql·oracle·select·where·条件优化·查询优化技巧
2501_931803758 小时前
MySQL 锁机制详解
数据库·mysql
.Hypocritical.11 小时前
MySQL |常用 SQL 语句与 pymysql 函数
mysql
NineData11 小时前
MySQL 到 Doris 实时数据同步:订单、用户和日志数据入仓方案
数据库·mysql
Dovis(誓平步青云)12 小时前
现场问题先关闭还是先验收,建筑任务怎样处理依赖
前端·javascript·数据库·mysql·音视频
xuefuhe13 小时前
MySQL:group_replication_start_on_boot vs group_replication_bootstrap_group
mysql
for_ever_love__13 小时前
MySQL Online DDL 完全指南:INSTANT/INPLACE/COPY 三种算法、MDL 锁事故与 gh-ost 实战
数据库·mysql·ddl·online·gh-ost·锁表·加字段