b树和b+树的区别

转载自https://blog.csdn.net/login_sonata/article/details/75268075

一,b树

b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。

█一个M阶的b树具有如下几个特征:

  1. 定义任意非叶子结点最多只有M个儿子,且M>2;
  2. 根结点的儿子数为[2, M];
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M],向上取整;
  4. 非叶子结点的关键字个数=儿子数-1;
  5. 所有叶子结点位于同一层;
  6. k个关键字把节点拆成k+1段,分别指向k+1个儿子,同时满足查找树的大小关系。

█有关b树的一些特性,注意与后面的b+树区分:

  1. 关键字集合分布在整颗树中;
  2. 任何一个关键字出现且只出现在一个结点中;
  3. 搜索有可能在非叶子结点结束;
  4. 其搜索性能等价于在关键字全集内做一次二分查找;

█如图是一个3阶b树,顺便讲一下查询元素5的过程:

1,第一次磁盘IO,把9所在节点读到内存,把目标数5和9比较,小,找小于9对应的节点;

2,第二次磁盘IO,还是读节点到内存,在内存中把5依次和2、6比较,定位到2、6中间区域对应的节点; 
3,第三次磁盘IO就不上图了,跟第二步一样,然后就找到了目标5。

可以看到,b树在查询时的比较次数并不比二叉树少,尤其是节点中的数非常多时,但是内存的比较速度非常快,耗时可以忽略,所以只要树的高度低,IO少,就可以提高查询性能,这是b树的优势之一。

█b树的插入删除元素操作: 
比如我们要在下图中插入元素4:

1,首先自顶向下查询找到4应该在的位置,即3、5之间; 
2,但是3阶b树的节点最多只能有2个元素,所以把3、4、5里面的中间元素4上移(中间元素上移是插入操作的关键); 
3,上一层节点加入4之后也超载了,继续中间元素上移的操作,现在根节点变成了4、9; 
4,还要满足查找树的性质,所以对元素进行调整以满足大小关系,始终维持多路平衡也是b树的优势,最后变成这样:

再比如我们要删除元素11: 
1,自顶向下查询到11,删掉它; 
2,然后不满足b树的条件了,因为元素12所在的节点只有一个孩子了,所以我们要“左旋”,元素12下来,元素13上去:

这时如果再删除15呢?很简单,当元素个数太少以至于不能再旋转时,12直接上去就行了。

二,b+树

b+树,是b树的一种变体,查询性能更好。m阶的b+树的特征:

  1. 有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
  2. 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
  4. 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
  5. 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。

█b+树相比于b树的查询优势:

  1. b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”;
  2. b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定(并不慢);
  3. 对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历,如下两图:
(0)

相关推荐

  • B树、B 树详解

    B树 前言 首先,为什么要总结B树.B+树的知识呢?最近在学习数据库索引调优相关知识,数据库系统普遍采用B-/+Tree作为索引结构(例如mysql的InnoDB引擎使用的B+树),理解不透彻B树,则 ...

  • Sorry!Hbase的LSM Tree就是可以为所欲为!

    我们先抛出一个问题: LSM树是HBase里使用的非常有创意的一种数据结构.在有代表性的关系型数据库如MySQL.SQL Server.Oracle中,数据存储与索引的基本结构就是我们耳熟能详的B树和 ...

  • mysql-索引

    一.索引是什么? 索引是帮助MySQL高效获取数据的数据结构. 二.索引能干什么? 索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要.索引能够轻易将查询性能提高好几个数量级,总 ...

  • B-Tree 和 B+Tree傻傻分不清楚

    B-Tree B-Tree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongoDB的索引技术就是基于B树的数据结构,B树也可以看作是对2-3查找树的一种扩展. ...

  • Python|一览小顶堆

    前言 堆排序是指利用堆这种数据结构所设计的一种排序算法.本节将以小堆顶为例来进行介绍. 问题描述 堆是一种完全二叉树(一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下.从左到右的顺序进行编号, ...

  • MySQL索引底层:B+树详解

    前言 当我们发现SQL执行很慢的时候,自然而然想到的就是加索引.对于范围查询,索引的底层结构就是B+树.今天我们一起来学习一下B+树哈~ 公众号:「捡田螺的小男孩」 树简介.树种类 B-树.B+树简介 ...

  • 教大家如何区别猕猴桃,公树和母树!一分钟学会!

    教大家如何区别猕猴桃,公树和母树!一分钟学会!

  • 视频 I 小叶红芽文人三角枫素材,文人树和其他树型的典型区别

        推 荐 阅 读:  (点滴)一张图告诉你正确的铝丝盘扎方法 论盆景的后期保养(一) 教大家如何剪枝--碎碎念004 冬季修剪谨防缩枝 如何给盆景换土换盆 盆景修枝.摘芽.摘心.摘叶的方法,让你 ...

  • 幸福树和发财树的区别

    幸福树别称蛇树.豆角树.接骨凉伞.牛尾树等,性喜高温多湿.阳光足的环境,耐高温.畏寒冷.宜湿润.忌干燥.发财树别称瓜栗.中美木棉.鹅掌钱.马拉巴栗等,喜高温多湿.不耐霜寒及干燥,下面我们就一起来看一看 ...

  • 国画创作一般都是从一棵树开始,想要衬托树就要虚化树后的背景。

    国画创作一般都是从一棵树开始,想要衬托树就要虚化树后的背景。

  • 石树 | 红树 | 幽树

    树在中国画中是一个重要元素,欢迎一起欣赏学习. 元 赵原<树石图> 团扇 绢本 设色 25×19厘米 收藏:故宫博物院藏 <树石图>局部1 赵原,元末画家.一作元,字善长,号丹 ...

  • 盆景里的镇宅树,桂花树、幸福树、平安树,堪称“吉祥三宝”

    近些年,随着盆景的盛行,人们不仅注重其外观上的靓丽,同时还会格外注意其寓意,如今天要介绍到的桂花树.幸福树.平安树,它们堪称镇宅树里的"吉祥三宝". 桂花树 寓意:人财平安喜乐.友 ...

  • 【说树】一树琼葩满庭芳

    投稿邮箱 古树名木,是大自然给予人类最无私的馈赠,是根植于苍穹下的历史见证.树木之于城乡,不仅是几片绿叶,而是一个个"乡愁"的寄托...... --题记 清明时节,发小叶琼琼教授从 ...

  • 学画山水画,首先要学会画树,学画树先学画枯树

    前面我们讲了树枝的画法,今天我们说下树叶的绘画技法,首先我们要知道树叶的分类,大概分为:点叶.针叶.双勾夹叶等,这些都是根据树叶的外型概括而形成,下面我们具体和朋友们介绍一下. 1.点叶 在画点叶时, ...

  • 【广东】林俊熙《毕业树,感恩树》指导老师:孟凡启

    毕业树,感恩树 东华小学六年级 林俊熙 时光匆匆跑过,水上十分平静,一片树叶飘到了湖上,立即起了层层涟漪.抬头一看,一棵棵莞香挺立在校道旁. 光阴似箭,日月如梭.仿佛做梦一样,从一个一年级的懵懂小孩, ...