大数跨境
0
0

【面试必备】B+ 树索引详解:结构与原理一文搞懂

【面试必备】B+ 树索引详解:结构与原理一文搞懂 Linux运维技术之路
2025-10-14
3
导读:【面试必备】B+ 树索引详解:结构与原理一文搞懂说到 MySQL 的核心,除了事务就是 索引。

 










 

【面试必备】B+ 树索引详解:结构与原理一文搞懂

说到 MySQL 的核心,除了事务就是 索引。而 InnoDB 的默认索引结构,就是大名鼎鼎的 B+ 树

👉 面试官最爱问的问题:

  • • 为什么 InnoDB 使用 B+ 树作为索引结构?
  • • B+ 树和 B 树、二叉树有什么区别?
  • • B+ 树索引是怎么加快查询的?

今天我们就彻底搞清楚!


一、为什么不用二叉树?

假设用二叉查找树存数据:

  • • 树高可能很大,查找需要多次磁盘 IO,效率低。
  • • 数据量大时会退化成链表。

👉 数据库追求的是 少磁盘 IO + 快速定位,二叉树显然不合适。


二、B 树 vs B+ 树

B 树(多路平衡查找树)

  • • 每个节点存 键 + 数据,叶子节点和非叶子节点都能存数据。
  • • 查找可能在中间节点结束。

B+ 树

  • • 非叶子节点只存 键(索引),不存数据。
  • • 所有数据都在叶子节点,而且叶子节点通过链表相连。

👉 好处:

  1. 1. IO 更稳定:查找一定走到叶子节点,树高更低。
  2. 2. 范围查询更快:叶子节点链表可以顺序遍历。

三、B+ 树索引的结构

📖 举例:假设我们有一棵阶数为 3 的 B+ 树:


   
    
           [17 | 35]
       /     |     \
 [3,8,12] [17,24,30] [35,40,50]
  • • 根节点/中间节点:只存键(比如 17、35),用来做导航。
  • • 叶子节点:存实际数据行的主键或指针,并且有链表相连。

👉 在 InnoDB 里,叶子节点存的是:

  • • 聚簇索引:叶子节点直接存整行数据。
  • • 二级索引:叶子节点存主键值,再通过主键回表。

四、B+ 树索引的查找过程

假设要查找 age=24

  1. 1. 从根节点开始:24 < 35 → 走中间节点 [17,24,30]
  2. 2. 在叶子节点二分查找 → 找到 24。
  3. 3. 如果是二级索引,还需要用主键再去聚簇索引回表。

👉 时间复杂度接近 O(log n),但更重要的是 树高低,磁盘 IO 少


五、B+ 树索引的优势

  1. 1. 磁盘友好
    • • 节点大小一般等于一页(16KB),一次 IO 就能读一个节点。
    • • 树高很低(通常 24 层),一次查询只需 24 次 IO。
  2. 2. 范围查询高效
    • • 因为叶子节点链表相连,可以顺序扫描。
    • • BETWEEN、ORDER BY、GROUP BY 等都能受益。
  3. 3. 支持排序
    • • 索引键天然有序,不需要额外排序。

六、为什么 MySQL 选 B+ 树?

  • • 二叉树太高,IO 太多。
  • • B 树数据分布在不同层,范围查询不友好。
  • • B+ 树 既能保证查询稳定,又能高效支持范围扫描,非常适合数据库。

👉 一句话总结:

B+ 树是为磁盘存储和范围查询量身定制的索引结构。


七、总结一句话

  • • 索引结构:InnoDB 默认用 B+ 树。
  • • 特点:所有数据存在叶子节点,非叶子节点只存索引,叶子节点有链表。
  • • 优势:低树高、磁盘友好、范围查询快、排序方便。

🎯 面试必备回答:

B+ 树是一种多路平衡查找树,非叶子节点只存键,所有数据存放在叶子节点,叶子节点之间有链表。
InnoDB 使用 B+ 树索引是因为它能降低树高,减少磁盘 IO,并且支持高效的范围查询。

 




 

 


往期回顾


【声明】内容源于网络
0
0
Linux运维技术之路
专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
内容 347
粉丝 0
Linux运维技术之路 专注运维架构、高可用、高并发、高性能、大数据、容器化、数据库、python、devops等开源技术和实践的分享。
总阅读760
粉丝0
内容347