废物大学生,在线写博客
1.为什么选用b+树
1.1 为什么不用二叉树
1.1.1 二叉树特点
二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
1.1.2 二叉树缺点
二叉树可能是不平衡的,最差的情况是退化到线性链表。
1.2 为什么不用平衡二叉树
平衡二叉树解决了二叉树的线性链表问题。
1.2.1 平衡二叉树特点
平衡二叉树:左子树和右子树的深度之差绝对值小于等于1。
非叶子节值大于左边子节点、小于右边子节点。
没有值相等重复的节点。
1.2.2 平衡二叉树缺点
1.搜索效率不足。一般来说,在树结构中,数据所处的深度,决定了搜索时的IO次数。如果数据量很大,就需要搜索很多次。
2.查询不稳定。目标结点处于不同深度,查询次数不同。
3.存储的数据内容太少。操作系统和磁盘之间数据交换是以页为单位的,一页为4K,即每次IO操作会将4K数据加载进内存。而平衡二叉树每个结点存放一条数据(二叉树每个结点=一个关键字+一个数据区+两个子节点的引用),每次都要加载。当目标结点处于深层次或叶子结点时,就会造成很多次IO操作。
1.3 多路平衡查找树(Balance Tree)
1.3.1 特点
一棵m叉树特点如下
1.每个结点最多有m个孩子(m>=2)
2.除根节点和叶子结点外,其他每个结点都有至少celi(m/2)个孩子 //ceil:向上取整
3.若根节点不是叶子结点,至少有两个孩子
4.所有的叶子结点都位于同一层。叶子节点不包含关键字(每个非叶子节点包含关键字)。
1.3.2 优点
解决了平衡二叉树的问题。
MySQL为了很好的利用磁盘的预读能力,将页大小设置为16K,即将一个节点(磁盘块)的大小设置为16K,一次IO将一个节点(16K)内容加载进内存。这样能减少总的IO次数。
1.4 B+树
1.4.1 B+树的定义
B+树是B树的一种变形形式,B+树上的叶子结点存储关键字以及相应记录的地址,叶子结点以上各层作为索引使用。一棵m阶的B+树定义如下:
(1)每个结点至多有m个子女;
(2)除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;
(3)有k个子女的结点必有k个关键字;
1.4.2 B+树与B树的区别
1.B+Tree 关键字的搜索采用的是左闭合区间,之所以采用左闭合区间是因为他要最好的去支持自增id,这也是mysql的设计初衷。即,如果id = 1命中,会继续往下查找,直到找到叶子节点中的1。
2.B+Tree 根节点和支节点没有数据区,关键字对应的数据只保存在叶子节点中。即只有叶子节点中的关键字数据区才会保存真正的数据内容或者是内容的地址。非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。而在B树中,如果根节点命中,则会直接返回数据。B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。
3.B+树的叶子结点是顺序排列的双向链表,叶子结点之间有指针连接。可以按照关键码排序的次序遍历全部记录。
1.4.3 B+树相比B树的优点
1.B+树是B树的变种,能解决B树能解决的问题。
2.B+树扫描只需要遍历叶子结点,效率更高。
3.B+树非叶子结点没有数据区,所以这些非叶子结点能存放更多关键字,从而减少IO次数。
4.B+树查询性能稳定。数据都在叶子节点,每次IO次数稳定。
5.B+树排序能力更强。它是有序的。
2.B+树的插入与删除过程
2.1 B+树的插入
初始状态如图:
B+树插入的三种情况总结如图:
2.1.1 Leaf Page未满&Index Page未满
举例
2.1.2 Leaf Page已满&Index Page未满
举例
2.1.3 Leaf Page已满&Index Page已满
举例
2.1.4 用旋转改进B+树的插入,减少拆分页
B+树总是会保持平衡,在平衡过程中,可能会有拆分页的操作,涉及到磁盘的操作,所以应该尽量减少拆分页。因此B+树同样提供了类似平衡二叉树的旋转功能。
旋转操作:发生在Leaf Page已满,但其左右兄弟结点未满的情况下,这时B+树不会急于做拆分页,而是先将记录移到所在页的兄弟节点上。通常,左兄弟会先被检查来做旋转操作。
插入70的举例如图,旋转操作减少了一次拆分页操作
2.2 B+树的删除
删除我觉得这里的演示更清晰https://www.jianshu.com/p/71700a464e97
B+树使用填充因子来控制树的删除变化,50%是填充因子可设置的最小值。
B+树的删除操作同样需要保证删除后仍然有序。
同插入一样,有三种情况,不同的是删除根据填充因子的变化来衡量。
B+树删除的三种情况如图:
初始状态如图:
2.2.1 叶子结点不小于填充因子&中间结点不小于填充因子
1.删除70
2.删除25:该结点还是Index Page的结点,所以将25右边的28替换到Index Page中
2.2.2 叶子结点小于填充因子&中间结点不小于填充因子
2.2.3 叶子结点小于填充因子&中间结点小于填充因子
删除60