Version: Next
B+ 树
B+树是B树的变体,常用于数据库与操作系统的文件系统中
MySQL数据库的索引就是基于B+树实现的
B+树的特点
- 分为
内部节点(非叶子)、叶子节点两种节点
- 内部节点(非叶子):只存储
key,不存储具体数据- 叶子节点:存储
key和value- 所有的
叶子节点会形成一条有序链表m阶 B+ 树非根节点的元素数量为x
- 则满足
向下取整(m/2) ≤ x ≤ m- 直观解释:
- B树:某个节点里面有
3个元素,那么这个节点一般有4个子节点,因为它能分出4个叉- B+树:某个节点里面有
3个元素,那么这个节点一般就有3个子节点
MySQL底层索引为何使用 B+ 树
- 为了减少IO操作次数,一般把一个节点的大小设计成最小读写单位的大小,与操作系统IO实现与物理IO实践相匹配
- MySQL的存储引擎InnoDB的最小读写单位是
16KB - 为了做到这一点,就会在一个节点里,放非常多的元素
- 由于树中存储的是
Key-Value类型的数据,而在数据库场景下,value本身是比较大的,采用B树则每个节点都会存储value,使得单个节点能够存储的元素数目下降
- MySQL的存储引擎InnoDB的最小读写单位是
- 对比
B树,B+树的优势是:- 每个非叶子节点存储的
key数量更多,意味着每个节点的分支也更多,树的高度更低 - 所有具体数据都存储在叶子节点上,所以每次查询都要到达叶子节点,查询速度比较稳定
- 所有叶子节点构成一个
有序链表,做区间查询更加方便;对于B树则需要使用树的中序遍历
- 每个非叶子节点存储的
B* 树
B* 树时 B+ 树的变体:给内部节点增加了指向 兄弟节点 的指针
m阶 B* 树的非根节点元素数量为x,则满足向下取整(2m/3) ≤ x ≤ m