1.B+树的定义
B+树是一个N叉排序树,一棵B+树包括根节点,内部节点(非终端节点),叶子节点(终端节点)。
1.1B+树的特性
- 除根节点外,其他所有节点要求所含关键字个数必须>=⌈m/2⌉。比如一个3阶的B+树,其节点的关键字个数就必须大于等于2个。
- 叶子节点含有全部信息并且含有指向关键字记录的指针,按从小到大的顺序排列。
- 非终结点是起到索引的作用,是其子节点的最大值或最小值
- 包含两个指针头,一个指向根节点,另一个指向关键字最小的叶子节点。
1.2B+树的特点
- 叶子节点是稠密分布,即每个关键字对应一个索引。非终结点相当于其子节点的索引,是稀疏索引。
- 查找过程是从上到下,不可能在非子节点终止,故查找效率稳定。
- 相比于B-树,更适合文件索引系统。
1.3B+树与B-树的比较
- 信息存储方式不同,B+树全部信息(数据+索引)都存储在叶子节点,内部节点只用于索引。而B-树每个节点都存有部分信息。
- 由于B+树的内部索引只包含索引信息,所占内存比B-树更小,所以一次读写的数量要更多,读写的次数相对较少,读写的代价也就更小。
- B+树每次查找都从上找到下,每次查找的路径长度都是一样的。而B-树可能在中间点就结束查找了。B+树的查找效率更加稳定。
2.B+树的应用
介绍B+树的具体实现以及在MySQL中的应用
2.1B+树的插入
大致分为以下4种情况
- 直接插入根节点中
- 插入根节点,但是子节点过分,需要进行分裂
- 当前节点是非根节点,且插入后节点关键字数目小于等于阶数,这里还要考虑新插入的节点是否是新索引
- 当前节点是根节点,插入后节点的关键字数目大于阶数。有两种情况,分别是同一层加一个和加一层。
树的删除与插入类似,主要考虑合并问题。
2.2MySQL中B+树的应用
(1)MyISAM
包括一个索引文件和数据文件,它的主索引是非聚集索引。当我们查询的时候,我们找到叶子节点中保存的地址,然后通过地址我们找到对应的信息。
(2)InnoDB 仅包含一个数据文件,索引本身就是数据。它是聚集索引的。
| MyISAM | InnoDB |
|---|---|
| 不支持事务 | 支持事务 |
| 不支持外键 | 支持外键 |
| 方便读 | 方便读写(修改)操作 |
| 非聚集索引 | 聚集索引 |
当修改时,数据库发生了变化,那么主键的地址也就发生了变化,这样MyISAM的主索引和辅助索引就需要进行重新建立索引。而InnoDB只需要改变主索引,因为它的辅助索引是存主键的。