一、为什么需要B-树?
树的查询效率高,而且可以保持有序。
二叉搜索树的复杂度是O(logN),性能已经很高,那为什么还要考虑使用B-树
从算法逻辑上来讲,二叉查找树的查找速度和比较次数都是最小的。
但是我们不得不考虑的一个现实问题:磁盘IO
数据库索引是存储在磁盘上,当数据量大时,索引可能有几个G甚至更多。当我们利用索引查询的时候,可以把索引全部加载到内存吗?显然不能。能做到的只有逐一加载每一个磁盘页。这里的磁盘页对应着索引树的节点
二、如果我们利用二叉查找树作为索引结构。假设树的高度是4,查找的值是10,那么流程如下:
由上知,磁盘IO的次数是4次,索引树的高度也是4.所以最坏的情况下。磁盘IO的次数等于索引树的高度
为了减少磁盘IO的次数,我们需要把原本“瘦高“的树结构变得”矮胖“,这就是B-树的特征之一
B树是一种多路平衡查找树,它的每一个节点最多包含K个孩子,k被称为B树的阶。
K的大小取决于磁盘页
以一个3阶B-树为例,来看看B-树的具体结构。
三、下面来具体介绍一下B-树(Balance Tree),一个m阶的B树具有如下几个特征:
1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m (k的大小取决于磁盘页的大小)
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
在这棵树中,(2,6)节点,该节点有两个元素
2,6。又有三个孩子1,(3,5),8。其中1小于2
(3,5)处于(2,6)之间 ,8大于6
假设查找5
文献: https://www.jianshu.com/p/fd49b1510dfd
一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B-树中是k-1个元素),每个元素不保存数据,
只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,
且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
B+树和B树的单元素查询,看似相同,实质有两点不同:
1:B+树的中间节点没有卫星数据,所以同样大小的磁盘页可以容纳更多的节点元素。这意味着,数据量相同的情况下,B+树的结构比B-树更加“矮胖”,因此查询时IO次数也更少
2:B+树的查询必须最终查找到叶子节点。而B-树只要找到匹配元素即可。无论匹配元素是叶子节点还是中间节点。由此,B-树的查询性能并不稳定(最好情况是只查询到根,最坏是查到叶子节点),而B+树每一次查找都是稳定的
1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询