MySQL索引的最左前缀匹配原则是什么?

news/2025/3/5 12:06:30/

目录

概念:

核心规则:

底层原理:

底层原因:


概念:

最左前缀匹配原则是复合索引(由多个列组成的索引)的核心使用规则,指查询必须从索引的最左列开始,并且不能跳过中间的列,才能充分利用索引的有序性。如果跳跃某一列,被跳过的那一列后面的字段索引会失效。

注意,是从索引的最左列开始,不是表的最左列开始,比如:

这张student表,我要为s_name、s_gen、s_dept_id这三个字段创建联合索引:

从表中可看到s_name是最左边的一列,然后是s_gen,最后是s_dept_id。但是我觉的根据MySQL 联合索引的创建标准,我想把s_dept_id设置为索引的最左列,然后是s_name,最后是s_gen:

高选择性的列(唯一值多、重复值少)应尽量靠左。但需权衡查询模式,例如即使 col2 选择性更高,如果查询总是先基于 col1 筛选,仍应将 col1 放在最左。

核心规则:

  1. 必须包含最左列 查询条件必须包含索引的最左列。例如,索引 (A, B, C) 的查询条件可以是 AA+BA+B+C,但不能是 BC

  2. 不能跳过中间列 若跳过中间列,后续列的索引无法生效。例如,A + C 会跳过 B,此时仅 A 生效,C 需回表过滤。

    以下是示例:

    查询条件包含索引的最左列(s_dept_id),并且不跳过中间列时:

    查询条件不包含索引的最左列:

    查询条件只包含索引的最左列:

    查询条件不跳过中间列:

    查询条件跳过中间列(s_name):

    由此,也可以推测:s_dept_id字段索引长度为5,s_name字段索引长度为42(47 - 5),s_gen字段索引长度为9(56 - 47)。

底层原理

联合索引在存储时,是按照索引列的顺序来构建B+树的,比如先按A排序,A相同的情况下按B排序,再按C排序。因此,如果查询条件没有从最左列开始,就无法利用这个有序的结构,只能进行全表扫描或者部分扫描。

范围查询(开区间/查询条件不带等值判断)后的列无法使用索引的情况

遇到范围查询(> 、<)会截断后续列(s_name和s_gen都被截断了):

如果某一列使用范围查询(如 ><BETWEEN),其后的列无法使用索引。例如:

  • ✅ 有效:WHERE A=1 AND B>2(仅使用 A, B

  • ❌ 无效:WHERE A=1 AND B>2 AND C=3C 无法生效)

底层原因

还是因为联合索引在存储时,是按照索引列的顺序来构建B+树的。比如WHERE A=1 AND B>2 AND C=3,这时候在索引中,A和B会被使用,但C可能不会被使用,因为B的范围查询导致C在索引中的顺序不再连续,无法有效利用。


http://www.ppmy.cn/news/1576810.html

相关文章

linux server docker 拉取镜像速度太慢或者超时的问题处理记录

已经按网上的帖子将镜像地址改为国内的了,用docker info命令查看,如下图所示: 但是还存在下载镜像特别卡的问题,而不是直接报错了,如下图所示: 甚至已经连续下载一晚上了,还是卡在这里,不见任何下载进展。 我在window的docker中下载了对应的镜像,并用以下语句生成了…

GPT-4.5实际性能评测:实际探索

摘要 经过数万轮严格测试&#xff0c;GPT-4.5的性能并未超越其前代产品GPT-4。此前发布的《GPT-4.5 一手实测&#xff1a;垃圾》一文中存在不准确描述&#xff0c;在此向读者致歉。尽管GPT-4.5在价格上有所提升且响应速度较慢&#xff0c;但测试结果显示其模型素质并未达到预期…

秒杀系统的常用架构是什么?怎么设计?

架构 秒杀系统需要单独部署&#xff0c;如果说放在订单服务里面&#xff0c;秒杀的系统压力太大了就会影响正常的用户下单。 常用架构&#xff1a; Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀&#xff0c;正常情况下&#xff0c;这 10 个商品应该均…

FFmpeg-chapter3和chapter4-读取视频流(原理篇和实战篇)

ffmpeg网站&#xff1a;About FFmpeg 1 库介绍 &#xff08;1&#xff09;libavutil是一个包含简化编程函数的库&#xff0c;包括随机数生成器、数据结构、数学例程、核心多媒体实用程序等等。 &#xff08;2&#xff09;libavcodec是一个包含音频/视频编解码器的解码器和编…

Linux驱动开发-字符设备驱动开发

Linux驱动开发-字符设备驱动开发 一&#xff0c;Linux驱动开发二&#xff0c;字符设备驱动开发1.具体实现2.1.1驱动模块具体函数实现2.1.2 应用调试模块具体函数实现2.1.3 Makefile2.1.4 进行测试2.1.4.1创建节点2.1.4.2 加载和卸载驱动模块2.1.4.3 测试 2.字符设备驱动应用程序…

【51单片机】程序实验13.串口通信

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 通信的基本概念串行通信与并行通…

游戏引擎学习第134天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 到目前为止&#xff0c;由于我们专注于古代游戏的开发&#xff0c;我们还没有深入思考资源应该如何存储以及在最终版本中如何高效管理。因此&#xff0c;在完成游戏的基本框架之前&#xff0c;我们必须先决定如何存储这些资…

使用300M带宽是否可以流畅地玩原神

本文来自腾讯元宝 ps&#xff1a;搬家了&#xff0c;需要装个路由器打游戏。 根据搜索结果&#xff0c;300M的网络带宽完全可以满足《原神》的流畅游玩需求。以下是具体分析及优化建议&#xff1a; 一、带宽需求与300M网络的适配性 ​带宽要求较低​ 《原神》作为一款开放世界…