MySQL InnoDB B+ 树索引底层原理与查询优化
MySQL InnoDB 存储引擎的索引底层是一棵 B+ 树。理解 B+ 树的结构、聚簇索引与二级索引的差异、以及覆盖索引与索引下推,是写出高性能 SQL 的基础。本文从原理入手,逐步剖析这些机制。
为什么是 B+ 树
常见的查询加速数据结构有:
- 二叉搜索树:极端情况下退化成链表,O(N) 查找
- 平衡二叉树(AVL/红黑树):O(log N),但每个节点只能存一个值,树高过高
- B 树(多路平衡查找树):每个节点存多个 key,减少树高度
- B+ 树:B 树的变种,只有叶子节点存数据,内部节点只存 key(路由)
InnoDB 选择 B+ 树有三个关键原因:
- 磁盘 I/O 友好:树高低(通常 3-4 层),单次查询只需 3-4 次磁盘寻道
- 范围查询友好:叶子节点按顺序链表相连,范围扫描无需回溯上层
- 查询效率稳定:所有数据都在叶子节点,路径长度一致
graph TB
R[root<br/>page 1]
R --> A[internal<br/>page 2]
R --> B[internal<br/>page 3]
A --> L1[leaf<br/>id=1..100]
A --> L2[leaf<br/>id=101..200]
B --> L3[leaf<br/>id=201..300]
B --> L4[leaf<br/>id=301..400]
L1 -.linked.-> L2
L2 -.linked.-> L3
L3 -.linked.-> L4聚簇索引 vs 二级索引
InnoDB 的索引分为两种,存储方式截然不同: