HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
  • 《k8s学习心得》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
  • 《k8s学习心得》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

      • MySQL

        • Innodb和MyISAM索引的区别
        • MySQL一些索引失效的场景和原理
        • MySQL如何行转列?
        • MySQL的架构和执行流程
        • MySQL的自增ID用完了会怎样?
        • MySQL索引的分类、何时使用、何时不使用、何时失效?
        • MySQL联合索引在B+数的存储结构和最左匹配原则原理
        • Mysql的索引和主键的区别
        • binlog、redolog、undolog的区别和作用
        • 什么是前缀索引,什么情况才使用?
        • 可重复读是否能解决幻读?
        • 我以为我对Mysql事务很熟,直到我遇到了阿里面试官
        • 聊聊MySQL索引的分类和结构吧
      • 中间件

      • 算法

      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • MySQL
#MySQL #B #联合索引在
HaC
2022-06-02
目录

MySQL联合索引在B+数的存储结构和最左匹配原则原理

# A&Q MySQL联合索引在B+数的存储结构和最左匹配原则原理

联合索引也是MySQL一个很常见的索引,有时候我们在 where 后面加了很多条件,合理使用联合索引可以提升我们的SQL执行效率。

而且联合索引还有一个最左匹配原则,概念相信大家都知道,但是原理是什么呢?

还是以Innodb为例子。

MySQL把 B+Tree作为索引底层数据结构,联合索引也是一样,它也是 B+Tree 的结构。

唯一索引、普通索引 在innodb上的实现也差不多,而联合索引的实现和普通索引的实现其实是一样的。

参考:Innodb和MyISAM索引的区别(B树、B+树、聚簇索引、非聚簇索引)?

假设 有表:

表T1有字段a,b,c,d,e,其中a是主键,并创建了一个联合索引idx_t1_bcd(b,c,d),然后b、c、d三列作为联合索引,在B+树上的结构正如上图所示。

联合索引(b,c,d)生成一个索引树,同样是B+树的结构,首先我们创建的index_bcd(b,c,d)索引,相当于创建了(b)、(b、c)(b、c、d)三个索引。

非叶子节点,上面两行,以第二行为例,b、c、d 组成的联合索引就是在B+树的结构,特点有:

  • 按顺序排列,按 b 排序:1、2、2、3、3、4、6、8
  • 如果字段 b 相等,再按字段 c 排序

所以到这里,你大概可以知道 最左匹配原则 的原理了。

最左匹配原则 它是依赖于联合索引的存储结构的,只有在匹配了最左边的索引 b ,才能知道这一行数据的位置。

比如说上面图片:

  • where b =1 ; 可以很容易知道它在第一个位置(它是有序的)
  • where c =2 ; 则可以找到两行,(2,2,2)和(3,2,2),这样在整体看来,是无序的,因为 c =2 ,它可以出现在节点的任何一个位置。所以这也是为什么最左匹配原则失效的原因。

列举一些SQL的索引使用情况:

select * from T1 where b = 12 and c = 14 and d = 3;-- 全值索引匹配 三列都用到
select * from T1 where b = 12 and c = 14 and e = 'd';-- 应用到b、c索引
select * from T1 where b = 12 and e = 'd';-- 应用到 b 索引
select * from T1 where b = 12  and c >= 14 and e = 'd';-- 应用 到b、c 两列列索引及索引条件下推优化
select * from T1 where b = 12  and d = 3;-- 应用到b 索引  因为不能跨列使用索引 没有c列 连不上
select * from T1 where c = 14  and d = 3;-- 无法应用索引,违背最左匹配原则

参考:

  • https://juejin.cn/post/6844904073955639304
#MySQL#B#联合索引在
上次更新: 2026-06-21 17:47:53
最近更新
01
MySQL支持的锁有哪些
06-21
02
HTTP 是不保存状态的协议, 如何保存用户状态
06-21
03
WebSocket、短轮询、长轮询的区别
06-21
更多文章>
Theme by Vdoing | Copyright © 2020-2026 HaC
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式