java八股文面试[数据库]——最左匹配原则

news2024/10/6 6:03:36

最佳左前缀法则

最佳左前缀法则:  如果创建的是联合索引,就要遵循该法则. 使用索引时,where后面的条件需要从索引的最左前列开始使用,并且不能跳过索引中的列使用。

最左匹配原则是什么?
简单来讲:在联合索引中,只有左边的字段被用到,右边的才能够被使用到。

左边是带头大哥, 必须在

假如我们创建联合索引 create index idx_a_b on shopTable(a,b);

有如下B+树

我们看到 最左边的a 都是有序的,分别是 : 1,1,2,2,3,3 但是右边的b 不一定有序: 1,2,1,4,3,2

但是在a都为 1 的情况下 b是有序的, 如: a=1时 b =1,2 ; a=2时, b= 1,4; a=3时 ,b=1,2;

如果我们筛选数据的时候, 直接筛选b ,整个就是无序的,需要做全表扫描

如果先a,再b 那么 ,就可以利用树来加快查找速度。

那么我们就基本可以得出最左匹配原则的定义:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配

场景1:  按照索引字段顺序使用,三个字段都使用了索引,没有问题。
EXPLAIN SELECT * FROM users WHERE user_name = 'tom' AND user_age = 17 AND user_level = 'A';

场景2: 直接跳过user_name使用索引字段,索引无效未使用到索引。

 EXPLAIN SELECT * FROM users WHERE user_age = 17 AND user_level = 'A';
场景3:  不按照创建联合索引的顺序,使用索引
 EXPLAIN SELECT * FROM users WHERE user_age = 17 AND user_name = 'tom' AND user_level = 'A';
where后面查询条件顺序是 `user_age`、`user_level`、`user_name`与我们创建的索引顺序 `user_name`、`user_age`、`user_level`不一致,为什么还是使用了索引,原因是因为MySql底层优化器对其进行了优化

 最佳左前缀底层原理
 

MySQL创建联合索引的规则是: 首先会对联合索引最左边的字段进行排序( 例子中是 `user_name` ), 在第一个字段的基础之上 再对第二个字段进行排序 ( 例子中是 `user_age` ) .

 

image.png

最佳左前缀原则其实是和B+树的结构有关系, 最左字段肯定是有序的, 第二个字段则是无序的(联合索引的排序方式是: 先按照第一个字段进行排序,如果第一个字段相等再根据第二个字段排序). 所以如果直接使用第二个字段 `user_age` 通常是使用不到索引的.

实战分析

首先我们来创建一个数据表tb_score,设置score和age字段组合成一个联合索引,索引的名称是“score_age_index”,在mysql中,int类型占4个字节,所以这个索引的长度是8个字节,这里计算索引的长度是为了判断sql语句是否走了索引

插入一些测试数据

CREATE TABLE tb_student (

`stu_id` int NOT NULL PRIMARYKEY AUTO_INCREMENTCOMMENT'主键id',

`name` VARCHAR(100) NOT NULL COMMENT '姓名',

`score` int NOT NULL COMMENT '成绩',

`age` int NOT NULL COMMENT '年龄',

INDEX score_age_index (`score`,`age`)

) ENGINE = InnoDB DEFAULT CHARSET=utf8;
insert into tb_student(name, score, age) value('张三',40,21);

insert into tb_student(name, score, age) value('王五',20,23);

insert into tb_student(name, score, age) value('李四',90,26);

insert into tb_student(name, score, age) value('赵六',60,19);

我们在分析查询语句是否走索引可以用到mysql提供的一个命令explain,如下图我们做了一个查询,根据分数查询学生的姓名,可以得出结论,查询走了我们定义的索引,并没有进行全表扫描,下面我们就根据各种情况进行分析。

1.全值匹配

mysql>explain select name from tb_student where age=20 and score=90;

根据结果可以得知,key_len 为8type为ref,本次查询用到了索引,虽然我们定义索引的顺序是(score, age),mysql可以进行优化,自动帮我们改变顺序

2.匹配左边的列
 

mysql>explain select name from tb_student where score=90;

上面这条sql语句,都是走索引的,因为他是从最左也就是score开始,连续匹配的。

而下面这条sql语句显然是不会走索引的,因为它并没有从最左连续匹配,这里走的是全表扫描,根据执行结果我们也可以看出,type是ALL代表全表扫描,没有使用到索引。

mysql>explain select name from tb_student where age=19;

3.匹配列前缀

 

如果列是字符型的话它的比较规则是先比较字符串的第一个字符,第一个字符小的哪个字符串就比较小,如果两个字符串第一个字符相同,那就再比较第二个字符,第二个字符比较小的那个字符串就比较小,依次类推,比较字符串。

如果score是字符类型,那么前缀匹配用的是索引,后缀和中缀只能全表扫描了。

mysql>select * from tb_student where name like 'As%'; //前缀都是排好序的,走索引查询

mysql>select * from tb_student where name like'%As'//全表查询

mysql>select * from tb_student where name like'%As%'//全表查询

4.匹配范围值

可以对最左边的列进行范围查询,结果是一定会走索引的。

mysql>explain select name from tb_student where score >60 and score <90;

多个列同时进行范围查找时,只有对索引最左边的那个列进行范围查找才用到B+树索引,可以看到key_len为4,也就是只有score用到了索引,在90>score>60的情况下,age是无序的,不能用索引,找到90>score>60的记录后,只能根据条件 age>20 继续逐条过滤.

mysql>explain select name from tb_student where score >60 and score <90 and age >20;

5.精确匹配某一列并范围匹配另一列

如果左边的列是精确查找的,右边的列可以进行范围查找,如果score=90,age是有序的,并且我们可看到key_len是8,说明走的是联合索引。

mysql>explain select name from tb_student where score =90 and age >20;

6.排序

   因为b+树索引本身就是按照上述规则排序的,order by的子句后面的顺序也必须按照索引列的顺序给出,就会走索引。

mysql> explain select name from tb_student order by score, age;

这里和我们预想的结果 不太一致,经过一番查证,如果数据库中的数据量过小的时候,mysql数据库会自动为我们做优化,它会认为全表扫描要比索引更快,所以就采用全表扫描方式。

如果我们颠倒顺序去排序,那么肯定不会走索引

mysql> explain select name from tb_student order by age,score;

如果最左边列的值是定值,则对其他列顺序排序是可以用到索引的。

mysql> explain select name from tb_student where score =60 order by age;

知识来源:马士兵教育

最左匹配原则_the_power的博客-CSDN博客

mysql索引最左匹配原则的理解 - 简书

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线上展厅可以用在哪些行业,线上展厅如何获取访客

引言&#xff1a; 随着数字化时代的到来&#xff0c;线上展厅成为了一种重要的营销工具&#xff0c;适用于多个行业&#xff0c;帮助他们吸引来自不同领域的潜在用户。 一&#xff0e;线上展厅在哪些行业有应用 1.零售行业 线上展厅为零售商提供了一个虚拟展示产品的平台&am…

ERROR 之 SpringMVC开发注解版之版本问题

如果你也和我一样&#xff0c;完全是按照狂神老师的代码来敲的&#xff0c;不用注解版的情况下是不会出错的&#xff0c;但是一用注解版&#xff0c;就出现了404&#xff0c;500的类型的错误。那我真诚的建议你换个jdk版本,再来试试。我试了3遍&#xff0c;事实证明用jdk1.8&am…

Springboot - 13.spring-boot-starter-security集成

&#x1f440;Spring Boot Starter Security 中文文档 Spring Security中文文档 &#x1f440;Spring Boot Starter Security 运行流程 当然可以。首先&#xff0c;我们会将用户存储和认证的流程融入整个Spring Boot Starter Security的使用流程中。以下是当你使用Spring Bo…

30岁成为项目经理有多难?

大家好&#xff0c;我是老原。 “30岁危机”真的是个土到掉渣的话题&#xff0c;但身边奔三的朋友&#xff0c;包括曾经奔三、现在奔四的自己&#xff0c;确实感受到了30岁焦虑。 或许&#xff0c;年龄无罪&#xff0c;30岁和危机真是被大家等的30岁焦虑绑架了。 中国古话说…

JavaScript必须掌握的三大器件:基础语法、BOM和DOM

目录 一、什么是 JavaScript 二、JavaScript 的基础语法 三、什么是JavaScript的BOM 四、什么是JavaScript的DOM 一、什么是 JavaScript JavaScript是一种广泛用于网页上实现交互功能的编程语言。它是一种脚本语言&#xff0c;可以嵌入到HTML页面中&#xff0c;并在浏览器…

食品化妆品核辐射检测

GB 14883.3-2016 GB 14883.3-2016 这次核污水时间&#xff0c;对我们的生活影响是比较大&#xff0c;尤其是未来几十年几百年的伤害最深&#xff0c;因为这是不可磨灭的伤害&#xff0c;无法去除&#xff01; 所以我要抵制日本任何的食物&#xff0c;尤其是海鲜食品&#xff…

Keil Flash的下载算法

更进一步的了解Keil Flash的下载算法 前面提到了通用算法的选择&#xff0c;那么问题来了&#xff0c;这个算法文件如何来的呢&#xff1f;如果你所用的MCU不是默认支持的品牌&#xff0c;如何编写属于自己的算法呢&#xff1f; 工具/原料 Keil uVision ULINK2仿真器 方法/…

连接云-边-端,构建火山引擎边缘云网技术体系

近日&#xff0c;火山引擎边缘云网络产品研发负责人韩伟在LiveVideoStack Con 2023上海站围绕边缘云海量分布式节点和上百T的网络规模&#xff0c;结合边缘云快速发展期间遇到的各种问题和挑战&#xff0c;分享了火山引擎边缘云网的全球基础设施&#xff0c;融合开放的云网技术…

69、配置AWS服务,接收来自RTSP流的推送

基本思想:在上一篇的基础和视频教程之后,进行简单的aws服务,进行RTSP流的接收 第一步: 第二步:配置video_stream,记得选择香港节点 同时记录这个信息,后面的策略需要填充 第三步:进行策略设置 第四步:策略设置,选中右上角的创建策略 第五步、进行json填充 第六步:填…

程序产生自我意识,创造人工生命

偶然发现一个大佬研究了一个很有意思的项目&#xff0c;研究了好几年&#xff0c;让程序产生自我意识诞生人工生命&#xff0c;感觉10年后肯定是继Chart GPT之后的又一个风口&#xff0c;在这里记录一下分享给大家&#xff0c;这个项目在git上有开源&#xff0c;开源地址&#…

CC-TDOB01 CC-TDIL01 有效地监控和管理热工设备

CC-TDOB01 CC-TDIL01 有效地监控和管理热工设备 新兴的互联工厂技术是霍尼韦尔启动其43的亮点注册营养师霍尼韦尔用户组(HUG)美洲研讨会&#xff0c;重点是向制造商展示数字化转型如何帮助他们实现更高水平的高性能。 来自石油和天然气、化工、纸浆和造纸以及金属和采矿行业的…

亚马逊重大更新,底层卖家的机会来了(干货)

最近&#xff0c;亚马逊对产品详细页面进行了又一次的改版。在这次改版中&#xff0c;亚马逊调整了产品详细页面的五点描述显示&#xff0c;无论是在电脑端还是移动端&#xff0c;大部分产品的五点描述都被折叠。 亚马逊的这一举动可能会改变传统的流量分配方式&#xff0c;进一…

Wasm软件生态系统安全分析

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第12期 | Wasm软件生态系统安全分析》 演讲嘉宾 | 王浩宇 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 王浩宇&#xff0c;华中科技大学教授&#xff0c;博士生导师&#xff0c;华中科技大学OpenHarmony技术俱乐部主任…

vmware设置桥接模式后ip设置

网络连接方式设置 找到虚拟机里机器的网络设置 左边是宿主机&#xff0c;右边是虚拟机&#xff0c;按照这个设置就可以上网了(IP指定一个没有占用的值&#xff0c;子网掩码和网关设置成一样的)就可以联网了。 over~~

leetcode1288. 删除被覆盖区间(java)

删除被覆盖区间 题目描述贪心法代码演示 题目描述 难度 - 中等 leetcode1288. 删除被覆盖区间 给你一个区间列表&#xff0c;请你删除列表中被其他区间所覆盖的区间。 只有当 c < a 且 b < d 时&#xff0c;我们才认为区间 [a,b) 被区间 [c,d) 覆盖。 在完成所有删除操作…

Error: Cannot find module ‘timers/promises‘

这个错误很要命 他会导致你本机所有的npm 命令全部报错 首先 这个错误是因为 npm 与 node版本不匹配导致的 最简单的办法就是 查一下你安装的这个npm 的版本适配那个版本的 node 然后将本地的node删除 控制面板写在node 然后去官方文档现在与本地npm 匹配的node.js 这样 你执行…

健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评

健康舒适的超满意照明体验&#xff01;SUKER书客SKY护眼台灯测评 2022年全国儿童青少年总体近视率为53.6%&#xff0c;其中6岁儿童为14.5%&#xff0c;小学生为36%&#xff0c;初中生为71.6%&#xff0c;高中生为81%&#xff0c;近视已成为当下人们遇到的比较普遍的眼健康问题…

一加真我OPPO手机ROOT后怎么2个手机登录1个微信-微信平板模式

因为工作或者某些原因&#xff0c;很多用户希望在2个手机上登录同1个微信&#xff0c;协同使用达到更方便的 效果。自从微信更新到新版以后&#xff0c;新增了个平板模式&#xff0c;这就给我们的思路提供了玩法。通过 刷机实测&#xff0c;大部分安卓手机都能实现2个手机登录1…

Dual Adaptive Representation Alignment for Cross-domain Few-shot Learning

小样本学习的目的是通过学习基础知识&#xff0c;在有限的支持样本下识别新的查询。在此设置中&#xff0c;最近的进展假设基础知识和新查询样本分布在相同的域中&#xff0c;这对于实际应用通常是不可行的。

02-系统篇-内存分布

一.进程中的内存分布 进程是应用程序运行的单位&#xff0c;进程在内存中运行时&#xff0c;各个部分分布的情况如图。 1.栈内存(statck) 特点:后进先出 系统一般会对栈的大小进行限制&#xff0c;可以用命令进行查看&#xff0c;如下&#xff0c;700是进程号&#xff0c;栈被…