我以前没有详细了解这块的时候还以为是b树是有三种呢 b树 b-树 和b+树,后来才发现根本没有b减树,那就是一个杠(-),b-树就是b树。
然后总结性的来说写一下B树和B+树的区别
B树:
首先B树有它的阶数,可以是2阶3阶4阶。。。。。。n阶,这个阶数是已知的
上面大概就是一个B树的结构,并且有构建b树的基本过程案例,
B树是如何删除一个关键字的
有多种情况 :首先需要算出B树的节点至少需要多少的关键字,(比如5阶的,除了根节点它每一个节点分支至少是5/2向上取整就是3,3个分支则,每一个至少有2个关键字)
- 当删除的关键字在的节点大于至少关键字且是终端节点的时候,直接删除就可以
- 如果不在终端节点的话,找该节点左子树最大值或右子树中最小的值来替换该关键字
- 如果在终端节点且所在节点的关键字到达了下线分两种
*向兄弟节点借一个(让父节点的关键字下来,然后让兄弟节点的上去,就借到了)
*兄弟节点的关键字都是下线(直接删除,然后合并(父节点下来将两个分支链接起来),选比较少的,否则随便)
B-树删除一个关键字可能造成不同的结果
B+树:
先画一个B+树的结构:
B+树与B树相比较
B+树是n个关键字n个分支
B+树的有叶子节点才存放信息,所有的非叶子节点仅仅是一个索引的作用 B树种关键字就是实实在在的关键字
Mysql为什么用B+树而不用B树来设置索引?
1. 首先B树的特点是深度浅,每层节点多,这样的设计就是为了减少磁盘I/O次数,但又因为B树的每个节点的关键字的date都会存在与节点种,所以他的节点会比较大,这又变相的增加了I/O次数,而B+来说的话,它的data全部在叶子节点,非叶子节点只是一个索引,节点比较小,I/O次数就比较少。
2. B+树的话,他的数据全在叶子节点,所以直接对叶子节点进行一个优化,就能对所以数据进行一个优化,这里就是将所有的叶子节点设置成是一个 链表结构,遍历会特别快,而且范围查询更不用说了。