【MySQL】InnoDB的索引为什么用B+树而不用B树?
面试版回答如下:
B+树相比B树有三个核心优势:
1.IO效率更高:B+树的非叶子节点不存数据,单次IO能加载更多索引键,减少磁盘访问次数。
2.范围查询更优:叶子结点形成双向链表,适合WHERE id>100这类查询。
3.数据稳定性好:所有数据都在叶子结点,查询时间复杂度稳定为O(log n)。
深层次详细比较:
1.更高效的磁盘I/O优化
- B+树的非叶子节点不存储数据,仅存储键值和指针,因此单个节点可以容纳更多索引项。这意味着:
- 树的高度更低:减少磁盘I/O次数(千万级数据可能只需3-4层)。
- 顺序访问更优:叶子结点通过链表串联,适合范围查询。
2.更稳定的查询性能
- 所有数据均存储在叶子结点,且叶子结点深度相同,因此任何查询的路径长度一致。时间复杂度均为O(log n)。
- B树的数据可能分布在非叶子结点,到时查询性能波动。
3.更适合数据库场景的特性
- 顺序扫描优势:B+树叶子节点形成链表,全表扫描或范围查询时不需要回溯上层节点。
- 缓存友好性:非叶子节点仅存储索引,可缓存更多关键路径,减少磁盘访问。
- 页分裂代价低:B+树的插入操作仅在叶子结点进行,分裂频率低于B树。