B+树
定义
- B+树,又称多路平衡搜索树,B树的变形,是在B树基础上优化的多路平衡搜索树
性质
- 分支节点的子树指针与关键字个数相同
- 分支节点的子树指针a[i]指向关键字值大小在[k[i],k[i+1])区间之间
每个结点的结构为(n,K1,A1,K2,A2,… ,Kn,An),相当于取消了最左孩子 - 所有叶子节点增加一个链接指针链在一起
- 所有关键字及其映射数据都在叶子节点出现:分支结点跟叶子结点有重复的值,分支结点存的是叶子结点的索引,即,父亲中存的是孩子结点中的最小值做为索引
- 分支结点可以只存key,叶子结点中存key/value。
插入操作
- B+树的插入过程与B树基本类似,区别在于:第一次要插入两层结点,一层做根,一层做分支;
- 后面一样是去找待插入位置,然后往叶子结点插入,若满了,就分裂一半给兄弟;然后转换成往父亲中插入一个key和child(孩子就是兄弟,key就是兄弟结点中第一个最小值的key)
B+树的应用
1. MyISAM引擎
- MyISAM引擎是MySQL5.5.8版本之前默认的存储引擎,不支持事务,支持全文检索,使用B+Tree作为索引结构,叶节点的key域存放的是主键,data域存放的是这一行数据的磁盘地址,即,MyISAM的索引文件仅仅保存数据记录的地址;主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
2. InnoDB存储引擎
- InnoDB存储引擎支持事务,从MySQL数据库5.5.8版本开始成为默认的存储引擎;InnoDB支持B+Tree索引、全文索引、哈希索引;
- InnoDB使用B+Tree作为索引结构时,具体实现方式却与MyISAM截然不同:InnoDB的数据文件本身就是索引文件,叶节点包含了完整的数据记录(聚集索引)
- 聚集索引使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
3. 两者区别
- MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址;
- InnoDB叶节点包含了完整的数据记录,且辅助索引data域存储相应记录主键的值而不是地址。
优势
- B+树做主键索引相比B树的优势:
B+树所有值都在叶子结点,遍历方便,方便进行区间查找;对于没有建立索引的字段,全表扫描的遍历很简单;分支结点只存储key,所占空间小,可以尽可能加载到缓存。
B*树
定义
- B*树,是B+树的变形,是在B+树基础上优化的多路平衡搜索树
插入操作
- B*树的插入操作与B+树基本类似,区别在于:
- 当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);
- 如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点(原结点的后1/3数据,兄弟结点的前1/3数据),最后在父结点增加新结点的指针。
所以,B*树分配新结点的概率比B+树要低,空间使用率更高。