关于B-树问题的演示图解

大家好,我是“Stephen·谢”,之前有讲到树(Tree)的概念,还演示了二叉查找树和红黑树这两种经典树的相关内容,其中引入了一个“自平衡”的概念,这个自平衡特性对树结构而言相当的重要,它是使我们的树结构变得实用方便的重要手段。由此,开始下面B树(B-Tree即Balance Tree)的讲解。


首先补充一点,标题中的"B-树"就是“B树”,它们都是B-Tree的翻译,里面不是减号-,是连接符-。因为有人把B-Tree读成"B-树",让人误以为“B树”和"B-树"是两种树,实际上两者都是同一种树。还有,大家在读的时候千万不要读成“B减树”,读成“B树”就行了,不然就外行了。

下面开始今天正文,我们依然从数据库的检索开始,我们知道数据库的索引是使用树结构来实现的,是因为树的查询效率高,而且还可以保持有序的状态。上篇中讲到的二叉查找树效率就很高,但是为什么没有使用二叉查找树来实现索引呢?其实从算法逻辑上讲,二叉查找树的查找次数和比较次数都是最小的,但是我们必须还要考虑一个现实问题:磁盘的IO(磁盘读写)。

数据库的索引是存储在磁盘上的,当数据量非常大的时候,索引的大小可能有几个G甚至更多,当我们利用索引查询的时候显然不可能将整个索引全部加载到内存,正常的操作都是逐一加载每一个磁盘页,这里的磁盘页就对应着索引树的节点。


索引树和磁盘页

我们如果利用二叉查找树做索引结构,查找情形是什么样子的呢?假设树的高度是4,要查找的值是10。

以此二叉查找树为例查10
这是第1次和第2次磁盘IO的结果
这是第3次和第4次磁盘IO的结果

磁盘IO的次是4次,即树的高度,最坏的情况就是磁盘IO的次数等于索引树的高度。既然如此,为了减少磁盘IO的次数,我们就需要把原来的“瘦高”树结构变得“矮胖”,这就是本文所要说的B-树的特征之一。

B-树(以下都称作B树)是一种多路平衡查找树,它的每个节点最多包含k个孩子,其中,k被称为B数的阶,k的大小取决于磁盘页的大小。

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

1、根节点至少有两个子女;

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

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

4、所有的叶子节点都位于同一层;

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

我们以一个3阶B树为例来看一下B树的结构,树中的具体元素和上面的二叉查找树是一样的。

3阶B树

我们来看(2,6)节点,该节点有两个元素2和6,又有三个孩子1,(3,5),8。其中1小于元素2,(3,5)在元素2,6之间,8大于元素6,符合上面的几条规则。

(2,6)分支

接下来我们来看一下B树的查询过程,看看会带来什么效果,假如我们要查询的数值是5

第1次磁盘IO
在内存中定位(和9比较)
第2次磁盘IO
在内存中定位(和2,6比较)
第三次磁盘IO
在内存中定位(和3,5比较)

从上面我们看出,其实B树在查询中的比较次数并不比二叉查找树少,尤其当单一节点中的元素数量很多时。可是相对磁盘IO的速度,在内存中比较耗时几乎可以忽略,所以只要树的高度足够低,磁盘IO次数足够少,就可以提高查询性能。就算单个节点内元素多一点也没关系,仅仅是多了几次内存中的交互,可以忽略用时。其实说白了B树的优势和高效就是因为B树将一部分的IO负担到内存中来了,用内存的高效和强大提升了查询性能。


下面我们来看一下B树的插入和删除

B树插入新节点的过程比较复杂,分好多种情况,此处举一个最典型的例子,还使用上面的B树,假如我们要插入的值是4,自顶向下查找4的位置,发下4应当插入到节点元素3,5之间,

插入4

可是节点3,5已经是两节点元素,无法再增加,父节点2,6也是两节点元素,无法再增加。倒是根节点9是单元素节点,可以升级为两元素节点,于是拆分节点2,6和节点3,5,让根节点9升级为两元素节点4,9,节点6独立为根节点的第二个孩子。

插入4后的B树

由此看出,插入一个节点,会让B树的那么多节点发生连锁改变。也正是如此,保证了B树始终维持多路平衡,这就是B树的一大优势,也是B树英语Balance-Tree中Balance的体现。

下面再看看B树的删除机制,以上面插入4后的B树为例,删除元素11,首先自顶向下找出11的位置

自顶向下找出11的位置

删除11后,节点12只有一个孩子,不符合B树规范,因此找出12,13,15三个节点的中位数13,取代节点12,而节点12自身下移成为第一个孩子。(此过程称为“左旋”)

删除11
左旋完成



以上便是B树的查询,新增和删除的机制,B树主要应用于文件系统(FS)以及部分数据库索引,比如著名的非关系型数据库MongoDB。但是绝大多数关系型数据库,比如MySQL,都使用B+树作索引,所以下篇将会介绍B+树的相关内容。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 13,107评论 0 25
  • 原文链接 B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(...
    非典型程序员阅读 1,137评论 0 3
  • B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balan...
    铁甲依然在_978f阅读 1,442评论 0 4
  • 深秋,北京又笼罩在雾霾之下,身体带有着些许不适,可抱怨已经减少了很多,甚至可以把雾霾的天气当作笑话来谈。 我有点咳...
    FreeManFree阅读 232评论 0 0
  • 无论春夏秋冬,这里窗外总能听见鸟儿鸣叫,尤其是上午时分,只要你想听。当然我不知道那是什么鸟,以我的常识,只认...
    lenmon928阅读 231评论 0 0