B-树

mysql的索引的索引主要基于B+树,要弄清楚B+树,首先需要从B-树开始,B-树就是B树,中间是横杠不是减号。

索引为什么不使用二叉树

数据库库的索引之所以使用树的存储结构,是因为树的查询效率高,而且可以保持有序。那为什么不使用二叉树的数据结构来存储呢?其实从算法的逻辑上来说,二叉树的比较次数是最小的,但是不得不考虑一个现实问题,磁盘的IO。数据库的索引是存储在磁盘上的,当存储量比较大的时候,索引的大小可能有几个G甚至更多。当我们用索引查找时,显然是不能将索引全部加载到内存里。能做的只是加载每一个磁盘页,这里的磁盘页对应着索引树的节点。如果用二叉树做索引,在最坏的情况下磁盘的IO次数就是树的高度。所以为了减少磁盘的IO次数就需要把瘦高的树变为矮胖的树,这就是B-树的特征之一。B树是一种多路平衡二叉树,它的每一个节点最多可以包含k个孩子,k被称为树的阶,k的大小取决于磁盘页的大小。

下面来具体介绍一下B-树(Balance Tree)

一个m阶的B树具有如下几个特征:

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

举例

如果是二叉树查找一个10的节点

第一次磁盘IO


第二次磁盘IO


第三次磁盘IO


第四次磁盘IO


所以二叉树最坏的情况下磁盘的IO取决于树的高度,为了减少磁盘的IO就需要将瘦高的树改为矮胖的树。

如果是B-树的话,查找5如下:

第一次磁盘IO


第二次磁盘IO,在内存中比较2和6


第三次磁盘IO,在磁盘中比较3和5,找到5


可以看出B-树的比较次数并不比二叉树少,但是相比于磁盘IO,在内存中比较要快得多,所以B-树的效率要高于二叉树。

如果我们现在要插入一个新元素4,发现4应该插在3和5之间,但是3和5这个节点已经有两个元素了,无法再增加。父亲节点 2, 6 也是两元素节点,也无法再增加。根节点9是单元素节点,可以升级为两元素节点。于是拆分节点3,5与节点2,6,让根节点9升级为两元素节点4,9。节点6独立为根节点的第二个孩子。


B-树的插入确实有点麻烦但是也是因为这样,B-树一直保持着自平衡。

如果现在需要删除一个元素,比如11。删除11后,节点12只有一个孩子,不符合B树规范。因此找出12,13,15三个节点的中位数13,取代节点12,而节点12自身下移成为第一个孩子。(这个过程称为左旋



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值