数据库笔记:B树、B+树

子龙
• 阅读 245

1 B树

1.1 一颗m阶B树的定义

  1. 每个结点最多有m-1个关键字。
  2. 根结点最少只有1个关键字。
  3. 非根结点至少有Math.ceil(m/2)-1个关键字。注:Math.ceil()是取上界的意思
  4. 每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
  5. 所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。
    数据库笔记:B树、B+树

    1.2 B树的插入/删除

    https://www.cnblogs.com/nullzx/p/8729425.html

    1.3 采用B树而不采用二叉搜索树的原因

    事实上,搜索过程中,B树的比较次数并不比二叉搜索树少,尤其是单一节点中元素个数比较多时。
    但是,B树的深度低于二叉搜索树,因此查询时经过的节点数量比二叉搜索树少。在查询时,每到一个新的节点都对应了一次I/O操作,与I/O耗时相比,比较耗时可以忽略。因此,B树的I/O操作少,查询时间更短

2 B+树

2.1 B+树与B树最大的不同

内部结点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子结点中。

2.2 一颗m阶的B+树定义

  1. B+树包含2种类型的结点:内部结点(也称索引结点)和叶子结点。根结点本身即可以是内部结点,也可以是叶子结点。根结点的关键字个数最少有1个。
  2. m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个子树),阶数m同时限制了叶子结点最多存储m-1个记录
  3. 内部结点中的key都按照从小到大的顺序排列,对于内部结点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子结点中的记录也按照key的大小排列。
  4. 每个叶子结点都存有相邻叶子结点的指针,叶子结点本身依关键字的大小自小而大顺序链接。
    数据库笔记:B树、B+树

    2.3 B+树的插入/删除

    https://www.cnblogs.com/nullzx/p/8729425.html

    2.4 B+树比B树更适合作文件索引/数据库索引

  • 不同于B树只适合随机检索,B+树同时支持随机检索和顺序检索
  • B+树的磁盘读写代价更低B+树的内部结点并没有指向关键字具体信息的指针,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素。
  • B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。
    而在B+树中,随机检索时任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当。
  • 数据库索引采用B+树的主要原因:

    • B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。
    • B+树的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作。

    2.5 补充:B*树

    数据库笔记:B树、B+树
    在B+树的非根和非叶子结点增加了指向兄弟的指针

    B*树是B+树的变种,相对于B+树他们的不同之处如下:

    • 首先是关键字个数限制问题,B+树初始化的关键字初始化个数是cei(m/2),B树的初始化个数为(cei(2/3m)),即块的最低使用率为2/3
    • B+树节点满时就会分裂;而B*树结点满时会先检查兄弟结点是否满(每个结点都有指向兄弟的指针)如果兄弟结点未满,则向兄弟结点转移关键字,然后在原结点插入新的关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);
      如果兄弟结点已满,则在原结点与兄弟结点之间增加新结点,并从当前结点和兄弟结点各拿出1/3的数据到新的结点中,最后在父结点中增加新结点的指针。

    特点:

    • 与B+树相比,其非根结点初始化的容量变大(cei(2/3*m)),使得结点的空间使用率更高
    • 因为存有兄弟结点的指针,可以向兄弟结点转移关键字,使得B*树的分裂(分配新结点)概率更低
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
似梦清欢 似梦清欢
2年前
树与二叉树
二叉树层次建树二叉树(BinaryTree)是由有限个结点组成的集合,它或者为空集合,或者仅含一个根结点,或者由一个根结点和两棵互不相交的左、右子树组成。树为空即根节点为空。二叉树的基本形态如下图:a:空的二叉树,treeNULL。b:只有空节点的二叉树,
Kubrnete Kubrnete
4年前
二叉树题集(持续更新中)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。1\.求二叉搜索树最大深度输入格式:输入给出一行整数序列作为二叉搜索树的键值,数字间以空格分隔,输入0结束(0不计入该二叉树键值)。输入样例:8685109110输出样例:4常规的求二叉搜索树深度的做法是递
Stella981 Stella981
3年前
B+树原理以及Java代码实现
最初查找二叉树,由于树的高度会随着有序序列输入而急剧增长,后来出现平衡二叉树,红黑树。B树可以海量数据的快速查询检索,B树主要分为B树(B树),B树,B\树等。B树(B树)M路搜索树,参数M定义节点的分支个数;对于根节点孩子数目为\2,M\,对于其余节点孩子数目为\M/2,M\;每个节点含有关键字属性,至少M/21
Wesley13 Wesley13
3年前
B树与B+树的区别?
1.B树简介B树是一种多路平衡搜索树。它由二叉树变换而来的。定义如下:1.1每个节点最多有m1个关键字1.2根节点最少有1个关键字1.3非根节点至少有m/2个关键字1.4每个节点的关键字都是按照从小到大的顺序排列,每个关键字的左子树中的关键字都小于它,而右子树中所有关键字都大于它。1.5所有的叶子节点都处于同
Wesley13 Wesley13
3年前
Java实现 LeetCode 814 二叉树剪枝 (遍历树)
814\.二叉树剪枝给定二叉树根结点root,此外树的每个结点的值要么是0,要么是1。返回移除了所有不包含1的子树的原二叉树。(节点X的子树为X本身,以及所有X的后代。)示例1:输入:\1,null,0,0,1\输出:\1,null,0,null,1\解释:
Wesley13 Wesley13
3年前
PHP数据结构与算法:二叉树
一、定义二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(leftsubtree)和“右子树”(rightsubtree)。二、特性1.在二叉树的第i层上至多有2^(i1)个结点(i0)2.深度为k的二叉树至多有2^k1个结点(k0)3.对于任意一棵二叉树,如果其叶结点数为N0,而
Wesley13 Wesley13
3年前
B
BTreeBTree又叫做B树,和平衡二叉树不同的地方在于B树是多叉树(平衡多路查找树),Oracle和MongoDB的索引技术就是基于B树的数据结构,B树也可以看作是对23查找树的一种扩展。一个m阶的BTree有以下性质1.每个节点最多有m个子节点;2.每个非叶子节点(根节点除外)至少含有m/2个子节点;3.
Wesley13 Wesley13
3年前
MySql的数据库优化到底优啥了都??(4)
  上回刚刚讲到了BTree这次来简单学学BTree索引  BTree中每个节点包含:  1.本节点所含关键字的个数。  2.指向父节点的指针  3.关键字  4.指向子节点的指针  关于BTree的规则  1.m阶的BTree每个结点至多可以拥有m个子节点,根结点至少有两个子节点  2.根结点的关键字(key)
Stella981 Stella981
3年前
LeetCode 235. 二叉搜索树的最近公共祖先
原文链接: LeetCode235.二叉搜索树的最近公共祖先(https://my.oschina.net/ahaoboy/blog/3118052)给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x