MySQL 的 B+ 树

B+ 树是 B 树的变体,特点:

  • 非叶子节点只存键值(索引): 非叶子节点不存储实际的行数据(Data),只保存索引 Key 和指针
  • 叶子节点存储所有数据: 所有完整的行记录(或主键指向的数据地址)都存放在叶子节点中
  • 叶子节点由双向链表连接: 叶子节点之间通过指针相连,形成一个有序的双向链接
  • 所有叶子节点深度相同: 保存了查询任何数据的 IO 次数是稳定的

为什么 MySQL 选择 B+ 树?

极高的查询效率与稳定性

由于非叶子节点不存数据,一个磁盘页(默认 16KB)能存放更多的索引键。这意味着树的扇出(Fan-out)更大,树的高度更低

  • 通常 3 到 4 层就能支撑千万级甚至更多的数据
  • IO 次数固定(即树的高度),查询性能稳定

范围查询能力

  • B 树: 做范围查询需要不断进行中序遍历,跨层回溯,IO 波动大
  • B+ 树: 只需要在树结构中找到范围的起点,然后顺着叶子节点的双向链表横向遍历即可,适合 BETWEEN>< 以及 ORDER BY 操作

全表扫描更高效

由于叶子节点包含了所有数据,全表扫描只需要遍历叶子节点链表,而不需要像 B 树那样遍历整棵树

B+ 树在 InnoDB 中的具体实现

  • 聚簇索引(Clustered Index):

    • 通常是主键
    • B+ 树的叶子节点直接存储整行数据
  • 二级索引(Secondary Index):

    • 叶子节点存储的是主键值,而不是磁盘地址
    • 回表查询: 通过二级索引查询到主键,再加到聚簇索引查找整行记录(除非触发了索引覆盖
posted @ 2026-05-08 10:08  我已有个她  阅读(9)  评论(0)    收藏  举报