B树 也叫 B-树

用途:用于少部分数据库和mongdb索引

索引:如果我们去查询某的字段等于某个值的数据,我们要去遍历所有数据才能得出,但是我们如果建立了索引,也就是对某个字段建立了索引,我们就可以高效的直接查找出对应值的数据在哪里了,底层用B,B+树实现

 

B树的特性:待补

为什么需要B树?

其实就一般自己来说二叉搜索树的效率要高于B树,比较次数比B树少,但是一个重要的问题磁盘IO,因为如果对于海量数据的话,建立起来的索引也是非常大的,我们只能一次加载一个对应的磁盘页进来,这里也对应这一个节点的数据,因为从磁盘中读取数据这个操作的时间远远的要比内存中比较长,所以我们可以牺牲多次比较来减少磁盘IO,也就是让建立出来的树尽量的矮胖,B树也叫多路平衡查找树,二叉搜索树其实也可以叫二阶B树,B树的阶数主要看分叉的数量,节点内的关键字是阶数-1

 

例子:待补

 

 

B树的三大操作  查找,插入,删除

查找

查找的话和二叉搜索树的原理一样的

例子:待补

插入

首先我们直接找到那个对应的节点,然后插入,因为每个节点只能存放m阶-1个关键字,如果到了m就要分裂节点

分裂节点:左边一半当左节点,右边一半当右节点,中间一个升入父节点,如果父节点出现类似情况也要分裂

例子:待补

删除

 

每个节点存放的关键字必须是一半

有三种情况

1,如果删除的那个节点的关键字删除一个后还有一半,那就直接删

2,如果删除后,不够一半了,发现兄弟节点还够,就左移或者右移节点一下

3,如果兄弟也不够的话,就从父亲节点这个拿出那个分割的关键字和兄弟还有自己合并成一个新节点,然后合并

删除非叶子节点的时候要注意,这里删了之后要和二叉搜索树一样找出右儿子节点中最小的关键字替代,这样才能实现二叉搜索树的特性

例子:待补

代码:待补

 

 

B+树

属于B树的变体,现在大部分数据库都用的是B+,mysql也是

B+树有B树的一切特性,只是在这基础上加了一点东西

1,非叶子节点都只存放用来比较的关键字,真正数据都在叶子节点,目的是为了可以让非叶子节点存放更多关键字,让树更加矮胖,减少IO次数

2,叶子节点用了链表相连

主要用来优化了单个查询和范围查询

单行查询

B树不太稳定,可能是根节点,也可能是叶子节点,B+树更加矮胖,每次搜到叶子,因为更加矮胖所以减少了磁盘IO

范围查询

B树要先搜索到下限,然后使用中序遍历,但是B+树的话只要搜索到下限,然后链表遍历就可以了

例子:待补

 

参考博文:

https://www.jianshu.com/p/8b653423c586

https://www.jianshu.com/p/1f2560f0e87f

https://www.cnblogs.com/nullzx/p/8729425.html

https://blog.csdn.net/geek_jerome/article/details/78895289