Lazy loaded image
为什么 MySQL 索引使用 B+ 树,而不是其他树结构?
字数 966阅读时长≈ 3 分钟
2026-10-11
type
Post
status
Published
date
Oct 11, 2026
slug
sql
summary
tags
技术探索
category
icon
password
以常用的 InnoDB 为例,主键索引和普通二级索引使用 B+ 树:非叶节点负责导航,叶子节点保存索引记录,叶子页按顺序连接。
选择它的核心原因是:树矮、磁盘 I/O 少,范围查询方便。
对比结构
为什么 B+ 树更适合
二叉搜索树、AVL、红黑树
每个节点最多两个分支,数据多时树较高;B+ 树一个节点有很多分支,树更矮,通常需要访问的页更少。普通二叉搜索树还可能退化成链表。
B 树
内部节点也存数据记录;B+ 树非叶节点只存键和子页指针,能容纳更多分支,叶子页链表也让范围扫描更方便。
哈希索引
等值查询快,但不支持有序的范围扫描和排序;B+ 树能兼顾这些需求。

什么是B+树?

B+ 树是一种平衡的多叉搜索树:上层节点负责导航,叶子节点保存索引记录,叶子页按顺序连接。
  • 非叶节点: 只存键和子节点指针,能容纳很多分支,让树更矮、减少磁盘读页。
  • 叶子节点: 保存索引记录。例如 InnoDB 主键索引的叶子节点保存整行数据。
  • 叶子页链表: 定位到范围起点后,就能沿链表扫描,方便范围查询。blog.jcole.us

什么是B树?

相比B+树,非叶子节点会存具体数据,叶子节点没有用有序链表相连

什么是二叉搜索树

二叉搜索树(BST)每个节点存一个键,最多两个子节点,左子树更小、右子树更大。
本身不保证平衡,可能退化成链表。

什么是红黑树?

红黑树是一种自平衡的二叉搜索树,通过给节点标记红、黑两种颜色,并进行变色和旋转,防止树退化成链表。
  • 怎么查: 左子树的值更小,右子树的值更大,每次比较后选择一边继续找。
  • 怎么保持平衡: 插入、删除后,如果违反颜色规则,就通过变色和旋转调整结构,限制树的高度。
  • 优点: 查找、插入、删除的时间复杂度都能保持 O(log n),适合内存中频繁增删的有序数据。
  • 为什么 MySQL 不选它: 每个节点最多两个分支,数据多时树较高;B+ 树分支更多、树更矮,更适合减少磁盘读页次数。

MySQL底层怎么查一条数据?

例如查:
notion image
根页和中间页像两级目录,告诉你“该去哪个下一层页”;叶子页才保存实际订单数据。
① 先看根页的目录:
ID 范围
去哪个中间页
4900001~5000000
中间页 A
5000001~5100000
中间页 B
5100001~5200000
中间页 C
要找的 5000001 属于第二个范围,所以直接进入 中间页 B。
② 再看中间页 B 的目录:
ID 范围
去哪个叶子页
5000001~5000100
叶子页 1
5000101~5000200
叶子页 2
5000201~5000300
叶子页 3
5000001 属于第一个范围,所以进入 叶子页 1。
③ 到达叶子页 1:
这里真正存着 5000001、5000002……5000100 对应的订单记录,找到起点后,就开始顺序读取。
目录中的范围是由索引键划分出来的,跳转靠的是子页指针。
 
回到首页