简介

B-树即 B 树,这里的 - 可不是减号而是横杠的意思,就是“B 杠树”或者直接说“B 树”。B 树这种数据结构在解决文件系统以及部分数据库索引上起到关键作用(其他有部分数据库使用 B+ 树解决索引问题)

为什么有 B 树

为什么二叉排序树不适合做索引树?

因为如果我们利用传统的二叉排序树来读取指定元素时候,效率是非常高的(二分查找),但是问题是数据库索引我们是保存在磁盘中,而不是简单的内存中,当数据量比较大的时候,索引可能有几个 G,这个时候就比较麻烦了,你一次性读到内存里头不现实,怎么办呢?分几次读,第一次磁盘 IO 操作一下,然后再一次,然后再一次,每次加载一个磁盘片(磁盘片对应索引树的结点),换句话说磁盘 IO 的最大可能操作次数就是此二叉排序树的最大深度,于是我们想到使得二叉排序树深度缩减,那我们该怎么做呢?那我们用 AVL Tree 做索引树吧!自平衡的特性来降低它的深度!如何呢?

为什么平衡二叉树 AVL Tree 不适合做索引树?

平衡二叉树结点很多在逻辑结构相连的结点,在物理上不相连,所以说如果我们几次读取磁盘,很可能读不到,所以也不适合做索引树

B 树规则

数据结构-B树(简介)_索引

下面的 m 是 B 树的阶,阶就是一颗树每个结点最多包含的孩子数,m 取值与磁盘页大小有关

  • 1.根结点至少两个子女
  • 2.每个中间结点有 k-1 个元素,和有 k 个孩子,m/2 <= k <= m(m/2 向上取整)
  • 3.每个叶子结点有 k-1 个元素,m/2 <= k <= m(m/2 向上取整)
  • 4.所有叶子结点都位于同一层
  • 5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划
B 树操作
  • B 树的搜索

    B 树的搜索很简单,搜索的最大次数就是 B 树的最大深度,B 树保留了二叉排序树搜索的便捷性,所以搜索很快速,而且也杜绝了深度过深的问题,使得不会过于频繁的进行磁盘 IO 操作使效率降低

  • B 树的新增

    B 树的新增操作比较麻烦,很容易就要动树的结构,本文作为简介,不做深入探究

  • B 树的删除

    B 树的删除也是比较麻烦的,也容易动树的结构,本文作为简介,不做深入探究

B 树应用

Oracle 索引,mongoDB 索引

推荐 B 树好文

https://www.jianshu.com/p/8b653423c586