MySQL遵循最左前缀匹配原则?面试官:回去等通知吧

保姆级拆解:HP 1312NF/CM1415打印机进纸离合器清洁与更换全记录(附B站/油管视频指路) 本文详细记录了HP 1312NF打印机进纸离合器故障的诊断与修复全过程,包括故障判断、工具准备、拆解步骤、清洁更换技巧及预防措施。特别针对离合器内部海绵老化粘连问题,提供了电工胶布和硬纸片两种实用替代方案,并附有B站/油管视频指路,帮助用户轻松完成打印机维修。 阅读详情

我们都知道,MySQL的Innodb引擎中,索引是通过B+树来实现的。不管是普通索引还是联合索引,都需要构造一个B+树的索引结构。

那么,我们都知道普通索引的存储结构中在B+树的每个非节点上记录的索引的值,而这棵B+树的叶子节点上记录的是聚簇索引(主键索引)的值。

如:

那么,如果是联合索引的话,这棵B+树又是如何存储的呢?

在联合索引中,联合索引(name,age)也是一个B+树,非叶子节点中记录的是name,age两个字段的值,叶子节点中记录的是name,age两个字段以及主键id的值。

在存储的过程中,如上图所示,当age不同时,按照age排序,当age相同时,则按照name排序。

所以,了解了索引的存储结构之后,我们就很容易理解最左前缀匹配了:因为索引底层是一个B+树,如果是联合索引的话,在构造B+树的时候,会先按照左边的key进行排序,左边的key相同时再依次按照右边的key排序。

所以,在通过索引查询的时候,也需要遵守最左前缀匹配的原则,也就是需要从联合索引的最左边开始进行匹配,这时候就要求查询语句的where条件中,包含最左边的索引的值。

在了解了最左前缀匹配之后,日常我们在工作中,经常在简历索引以及查询的时候,都会基于这个默认的约定进行索引的设计和SQL的优化。

大家都默认MySQL一定是遵循最左前缀匹配的。会认为当一个age,name的联合索引存在时,如果查询语句中不包含age作为条件,就一定不走索引。

MySQL一定是遵循最左前缀匹配的,这句话在以前是正确的,没有任何毛病。但是在MySQL 8.0中,就不一定了。

索引跳跃扫描

MySQL 8.0.13 版本中,对于range查询(什么是range后面会提到),引入了索引跳跃扫描(Index Skip Scan)优化,支持不符合组合索引最左前缀原则条件下的SQL,依然能够使用组合索引,减少不必要的扫描。

通过一个例子给大家解释一下,首先有下面这样一张表(参考了MySQL官网的例子,但是我做了些改动和优化):

通过上面的SQL,先创建一张t1表,并把f1,f2两个字段设置为联合索引。之后再向其中插入一些记录。

分别在MySQL 5.7.9和MySQL 8.0.30上执行:

执行结果如下:

可以看到,主要有以下几个区别:

MySQL 5.7中,type = index,rows=160,extra=Using where;Using index MySQL 8.0中,type = range,rows=16,extra=Using where;Using index for skip scan

这里面的type指的是扫描方式,range表示的是范围扫描,index表示的是索引树扫描,通常情况下,range要比index快得多。

从rows上也能看得出来,使用index的扫描方式共扫描了160行,而使用range的扫描方式只扫描了16行。

接着,重点来了,那就是为啥MySQL 8.0中的扫描方式可以更快呢?主要是因为Using index for skip scan 表示他用到了索引跳跃扫描的技术。

也就是说,虽然我们的SQL中,没有遵循最左前缀原则,只使用了f2作为查询条件,但是经过MySQL 8.0的优化以后,还是通过索引跳跃扫描的方式用到了索引了。

优化原理

在MySQL 8.0.13 及以后的版本中,SELECT f1, f2 FROM t1 WHERE f2 = 40;SQL执行过程如下:

  • 获取f1字段第一个唯一值,也就是f1=1

  • 构造f1=1 and f2 = 40,进行范围查询

  • 获取f1字段第二个唯一值,也就是f1=2

  • 构造f1=2 and f2 = 40,进行范围查询

  • 一直扫描完f1字段所有的唯一值,最后将结果合并返回

也就是说,最终执行的SQL语句是像下面这样的:

​即,MySQL的优化器帮我们把联合索引中的f1字段作为查询条件进行查询了。

限制条件

在知道了索引跳跃扫描的执行过程之后,很多聪明的读者其实就会发现,这种查询优化比较适合于f1的取值范围比较少,区分度不高的情况,一旦f1的区分度特别高的话,这种查询可能会更慢。

所以,真正要不要走索引跳跃扫描,还是要经过MySQL的优化器进行成本预估之后做决定的。

所以,这种优化一般用于那种联合索引中第一个字段区分度不高的情况。但是话又说回来了,我们一般不太会把区分度不高的字段放在联合索引的左边,不过事无绝对,既然MySQL给了一个优化的方案,就说明还是有这样的诉求的。

但是,我们不能依赖他这个优化,建立索引的时候,还是优先把区分度高的,查询频繁的字段放到联合索引的左边。

除此之外,在MySQL官网中,还提到索引跳跃扫描还有一些其他的限制条件:

  • 表T至少有一个联合索引,但是对于联合索引(A,B,C,D)来说,A和D可以是空的,但B和C必须是非空的。

  • 查询必须只能依赖一张表,不能多表JOIN

  • 查询中不能使用GROUP BY或DISTINCT语句

  • 查询的字段必须是索引中的列

万物皆可GAN ---普通GAN, pix2pix, CycleGAN和pix2pixHD的比较以及演变过程 普通GAN, pix2pix, CycleGAN和pix2pixHD的原理、比较以及演变过程 阅读详情

相关推荐

STM32F4实战:手把手教你实现USB OTG双模式切换(Host/Slave)

本文详细介绍了如何在STM32F4上实现USB OTG双模式切换(Host/Slave),包括硬件架构解析、软件实现机制、主机模式下的U盘读写以及从机模式下的自定义设备开发。通过实战案例和优化技巧,帮助开发者快速掌握USB双角色功能,提升嵌入式系统开发的灵活性和效率。

u9v0w的博客 728

mysql索引最左原则面试_面试中常被提到的最左前缀匹配原则

最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。要想理解联合索引的最左匹配原则,先来理解下索引的底层原理。索引的底层是一颗B+树,那么联合索引的底层也就是一颗B+树,只不过联合索引的B+树节点中存储的是键值。由于构建一棵B+树只能根据一个值来确定索引关系,所以数据库依赖联合索引最左的字段来构建。举例:创建一个(a,b)的联合索...

weixin_29141505的博客 468

大模型量化技术全解析:从INT8到GPTQ/AWQ,降低部署成本实战指南

模型量化是一种通过降低神经网络权重和激活值的数据精度(如从FP16降至INT8/INT4),从而大幅减少模型内存占用和计算开销的核心模型压缩技术。其原理基于线性变换,将高精度浮点数映射到低精度整数表示,在硬件层面能利用专用低精度计算单元实现显著加速。这项技术的核心价值在于解决了大模型(如千亿参数LLM)部署时面临的高昂显存成本和推理延迟问题,使其能在消费级GPU和边缘设备上高效运行。当前,后训练量化(PTQ)因其无需重新训练的特性成为主流,衍生出GPTQ、AWQ、SmoothQuant等多种方法,广泛应用于

weixin_33804582的博客 629

我滴乖乖,MySQL联合索引不一定要求最左匹配?跳跃索引!

你好,我是yes。 关于 MySQL 索引相关的知识点,我已经写的差不多了,今天再来补充一点关于联合索引的。 之前我在群里就看到有同学说最左匹配已经过时了,现在 MySQL 8 都不需要最左匹配就能用上联合索引了。 那真的是这样吗? 以下实验基于 MySQL8.0.26 版本 为了故事顺利的发展,我们先建个表。 CREATE TABLE `t1` ( `f1` int NOT NULL AUTO_INCREMENT, `f2` int NOT NULL, `f3` int NOT NULL,

yes 1499

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

WorkBuddy KiCad 实战:国产 AI 搭子不只会写代码,传感器板从零走到可审查

真正可用的 PCB 教程不能承诺“一键打样”。本课把 WorkBuddy 放在需求拆分、文件生成和审查记录的位置,KiCad 负责 ERC、DRC 与制造文件,工程师负责最终判断。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、KiCad 8.0、Python 3.11 与人工审阅组成一条可复现链路。你会从“已确认的接口表、器件库来源、板框与电源方案”出发,得到“KiCad 工程、原理图、初始 BOM、ERC 报告与审查记录”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶

yueyeguzhuo的专栏 203

面试官:你竟然告诉我,联合索引不用遵循最左前缀原则?

欢迎点击下方????关注我,记得星标哟~联合索引的最左前缀原则,应该是MySQL方向的一道高频且入门级别的面试题了。一般情况下,考查对象是校招生或刚刚工作不久的候选人。面试场景大致如下:面试官:“建过MySQL的联合索引吧?可以说说它的最左前缀原则吗?”候选人:“好的。如果我们为一张表创建联合索引(a,b,c),当执行SQL语句进行查询的时候,必须按照该索引从左往右的顺序进行匹配,否则就使用不到该索引了...

田维常 316

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box。

成长需要沉淀。 397

索引使用规则1——最左前缀法则

这篇文章主要介绍索引的使用规则——最左前缀法则,关于索引的效率,可以查看上一篇文章最左前缀法则:索引使用了,使用一个索引名称索引了好几个字段。在这类索引中需要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始(必须包含最左列),并且不跳过索引的列。如果跳跃了某一列,索引失效(后面索引的字段都失效)。具体我们举个例子。

wjl990316fddwjl的博客 3103

n8n智能体开发:Microsoft Outlook 节点

使用 Microsoft Outlook 节点可以自动化 Microsoft Outlook 工作流程,并将其与其他应用程序集成。n8n 内置支持多种 Microsoft Outlook 功能,包括创建、更新、删除和获取文件夹、邮件及草稿等操作。

王国平的博客 570

AUTOSAR知识点 之 XCP (二):XCP基础概念

学习XCP的过程中,对XCP的基本概念要做一个全面的认知,因为里面有很多缩写以及难以理解的点,假设对此模模糊糊一知半解,那么对整个协议栈的认知会遇到极大的障碍。XCP的信号流传输图示如下XCP 标准主要分为 5 个部分:这部分提供了对于协议的一个概况介绍,包括 XCP 的功能和基础性内容。这部分内容对协议层进行了详细的规范和说明。

梦想技术家 2769

mysql索引中最左前缀原则

如果用(B,C)这样的数据来检索的话,就会找不到A使得索引失效。如果使用(A,C)这样的数据来检索的话,就会先找到所有A的值然后匹配C,此时联合索引是失效的。由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。因为辅助聚簇索引是把索引按照组合索引的顺序存到一起的,如果没有最左边一个,那么将定位不到对应的叶子节点。(a,b,c是索引) where后面的条件有没有给a对应的条件。最先匹配最左边的索引,匹配上就继续,如果匹配不上就检索不到。

weixin_47796247的博客 1247

13、核心网络模块:VyOS 设备配置实战

本文详细介绍了如何使用 Ansible 核心网络模块对 VyOS 虚拟设备进行自动化配置,涵盖环境搭建、变量设置、任务编写、playbook 运行及配置验证全过程。通过实际案例展示了 Ansible 在网络设备管理中的强大功能,包括多设备支持、模板化配置、备份回滚等优势,并提供了最佳实践建议与未来发展趋势分析,帮助读者提升网络运维效率。

linux6sysadmin的博客 114

MySQL遵循最左前缀匹配原则!面试官:回去等通知吧

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第408篇原创分享作者 l Hollis来源 l Hollis(ID:hollischuang)我们都知道,MySQL的Innodb引擎中,索引是通过B+树来实现的。不管是普通索引还是联合索引,都需要构造一个B+树的索引结构。那么,我们都知道普通索引的存储结构中在B+树的每个非节点上记录的索引的值,而这棵B+树的叶子节点上...

HollisChuang's Blog 1316

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知

的功能,当第一列索引的唯一值较少时,即使where条件没有第一列索引,查询的时候也可以用到联合索引。具体优化方式,就是匹配的时候遇到第一列索引就跳过,直接匹配第二列索引的值,这样就可以用到联合索引了。三个字段上创建联合索引时,实际上是创建了三个索引,分别是(a)、(a,b)、(a,b,c)。我:可能是晴天遵循,下雨了就不遵循了,每个月那几天不舒服的时候也不遵循了……遵循最左前缀匹配原则,即最左优先,查询的时候会优先匹配最左边的索引。如果查询条件包含(a,c),也会用到索引,相当于用到了(a)索引。...

m0_71777195的博客 1256

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

mysql:MySQL索引最左前缀匹配原则及实战应用

最左前缀匹配原则(Leftmost Prefix Principle)是MySQL复合索引使用的核心原则,它决定了查询能否有效利用复合索引。该原则指出:MySQL在使用复合索引时,会从索引的最左列开始向右匹配,直到遇到范围查询(>、<、between、like等)就停止匹配。fill:#333;color:#333;color:#333;fill:none;是否是否查询条件是否包含索引最左列?使用索引全表扫描是否有范围查询?使用到范围查询前的列尝试使用更多右列。

weixin_43290370的博客 1812

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

GitHub 4.8k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.8k Star 的Java工程师成神之路 ,真的确定不来了解一下吗? 本文来自一位不愿意透露姓名的粉丝投稿 相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。 因为索引...

HollisChuang's Blog 2万+

联合索引的最左前缀原则与失效场景

大家好,我是程序员卷卷狗。我们都知道给字段建索引能提高查询速度,但很多时候,你明明建了索引,SQL 却依然走全表扫描。面试官问:“联合索引的最左前缀原则是什么?“为什么有时候用了 LIKE、OR、函数就失效了?联合索引的底层结构是有序的前缀匹配树。联合索引的本质是一棵按列顺序排列的有序 B+ 树。最左前缀原则,是优化器决定是否能使用索引的根规则。一句话记住:匹配从左开始,遇“断”即停。掌握这一原则,你不仅能解释索引失效的原因,还能主动在表设计和 SQL 编写中“避坑提速”。

dividividiv的博客 1115

mysql的联合索引最左前缀原则_深入浅析Mysql联合索引最左匹配原则

前言之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。最左前缀匹配原则在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1、列col2和列col3建一个联合索引KEY test_col1_col2_col3 on test(...

weixin_30298733的博客 532

mysql 联合唯一索引_高频面试题:MySQL联合索引的最左前缀匹配原则

前言之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。最左前缀匹配原则在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1、列col2和列col3建一个联合索引KEY test_col1_col2_col3 on test(...

weixin_39524636的博客 674

Mysql联合索引最左匹配原则

原文链接:https://segmentfault.com/a/1190000015416513 前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 最左前缀匹配原则 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例...

lizc_lizc的博客 2266

MySQL调优之索引常见概念(最左前缀原则、索引下推等)

文章目录MySQL调优系列回表、覆盖索引、最左前缀原则、索引下推参考资料 MySQL调优系列 回表、覆盖索引、最左前缀原则、索引下推 面试官:小伙子,回表是什么了解么? 你略加思索后,答道:了解的。假设我们的 staff 表有一个主键索引和 name 字段的索引。当我们执行下面这条 SQL 时 select * from staff where name = 'quintin'; 会先查...

秀强的专栏 592

简述一下索引的匹配原则_面试官,你真的懂MySQL联合索引最左匹配原则?

之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,最近面试时和面试官交流,发现面试官大都理解有误,导致于误人子弟。今天就来整理下。最左前缀匹配原则在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1、列col2和列col3建一个联合索引KEY test_col1_col2_col3 on test(col1,col2...

weixin_30828697的博客 317
上一篇: 再有人说不懂MySQL的MVCC机制,把这篇文章甩给他
下一篇: 微服务架构下的认证鉴权解决方案
Java佳佳
博客等级 码龄4年 216粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值