mysql索引左倾_B树随笔 - suyain的个人空间 - OSCHINA - 中文开源技术交流社区

二叉树的缺点:如果数据量大,查找就退化成节点内部的线性查找了。二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下

B-tree树即B树

B树特性:

树中每个结点最多含有m个孩子(m>=2);

除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);

若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);

所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null);(读者反馈@冷岳:这里有错,叶子节点只是没有孩子和指向孩子的指针,这些节点也存在,也有元素。@研究者July:其实,关键是把什么当做叶子结点,因为如红黑树中,每一个NULL指针即当做叶子结点,只是没画出来而已)。

每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:

a)   Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。

b)   Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。

c)  关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。

bcdb0756e6be14f6c29e6168b3566231.png

45476ed122a53225fe57e12b7cd6b0df.png

B+树与B树的区别:

有k个子结点的结点必然有k个关键码;(非叶子结点的子树指针与关键字个数相同)

所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键码

树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。

d2ec978cb16f2dc90fb4e3e09aef9ab0.png

86087a4a2be452770ef472331cdf42e3.png

为什么说B+树比B 树更适合实际应用中操作系统的文件索引和数据库索引?

1) B+tree的磁盘读写代价更低

B+tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+ 树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+ 树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。

2) B+-tree的查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

数据库索引采用B+树的主要原因是 B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低)。

B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

文章推荐:

http://blog.csdn.net/v_JULY_v/article/details/6530142/

https://www.cnblogs.com/vincently/p/4526560.html (此文章中B+树的图貌似有问题,B+树的一个特性:有k个子结点的结点必然有k个关键码,但是图中,有k-1个关键字)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值