首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏用户4352451的专栏

    B+

    假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B在100万个数据中查找目标值,只需要读取两次硬盘。B 可以看作是对2-3查找的一种扩展,即他允许每个节点有M-1个子节点。 三、B+ B+是B-的变体,也是一种多路搜索,其定义基本与B相同,除了: 非叶子结点的子树指针与关键字个数相同; 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1 四、BB+的对比 B和B+的区别在于,B+的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。 2、B+的优点 由于B+在内部节点上不好含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。 而B则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+好。 3、应用 BB+经常被用于数据库中,作为MySQL数据库索引。

    71420发布于 2020-08-26
  • 来自专栏烟草的香味

    B+,索引

    引言 时隔一年,我又想起当初看数据库时,看到的B+,就是数据库的索引使用的数据结构。再整理一下,看看自己没有忘记很多吧。 概述 B+之前,先来看一下二叉查找(1,2,3,4,5,6,7) ? 但想想数据库查找数据的场景: select * from user where id > 10, 显然,对于这种查找区间来说,二叉查找并不高效。那么B+是如何解决这个问题的呢? 没错,这就是B+。 这个结构是怎么想出来的我不知道啊,但是我今天突然发现,他的存储方式和跳表十分之像啊。莫非是受到了跳表的启发?亦或是跳表受到了B+的启发?咱也不知道。 引申 很好,B+整明白了,新的问题出现了。如果数据库使用这种数据结构存储,全部放到内存中肯定是不现实的,势必要将其存储到硬盘中,待查找时再到文件中读取。 B+是不是分叉越多越好 那肯定不是越多越好啊,要是一层就把所有数据都存储了,要他还有什么用,根本没有起到快速定位的作用。 但我想说的并不是这。

    1.2K20发布于 2019-12-02
  • 来自专栏宇宙之_一粟

    BB+

    BB+都是用于外查找的数据结构,都是平衡多路查找。 两者的区别 在B+中,具有n个关键字的结点含有n棵子树,即每个关键字对应一颗子树;而在B中,具有n个关键字的结点含有(n+1)棵子树。 在B+中,除根节点外,每个结点中的关键字个数n的取值范围是[m/2]~m,根节点n的取值范围是2~m;而在B中,除根节点外,其他所有非叶结点的关键字个数n的取值范围是[m/2]-1~m-1,根节点n B+中的所有叶结点包含了全部关键字,即其他非叶结点中的关键字包含在叶结点中;而在B中,关键字是不重复的。 B+中的所有非叶结点仅起到索引的作用,即结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不包含该关键字对应记录的存储地址;而在B中,每个关键字对应一个记录的存储地址。 通常在B+树上有两个头指针,一个指向根节点,另一个指向关键字最小的叶结点,所有叶结点链接成一个不定长的线性链表,所以B+可以进行随机查找和顺序查找;而B只能进行随机查找。

    1.2K41发布于 2020-10-26
  • 来自专栏算法无遗策

    动画 | 什么是2-3

    2-3正是一种绝对平衡的,任意节点到它所有的叶子节点的深度都是相等的。 2-3的数字代表一个节点有2到3个子树。它也满足二分搜索的基本性质,但它不属于二分搜索2-3查找元素 2-3的查找类似二分搜索的查找,根据元素的大小来决定查找的方向。 动画:2-3插入 2-3删除元素 2-3删除元素相对比较复杂,删除元素也和插入元素一样先进行命中查找,查找成功才进行删除操作。 2-3为满二叉时,删除叶子节点 2-3满二叉的情况下,删除叶子节点是比较简单的。 动画:2-3删除 -----END---

    1K10发布于 2020-01-02
  • 来自专栏我是攻城师

    什么是2-3

    前面的文章提到过的二叉,每个节点的孩子个数最多的是2个,并且每个节点只有一个值,而2-3的节点的孩子个数只能是2个或者3个,这是一种多路的结构,类似的结构还有2-3-4B+等,多路的存在除了支持的平衡外 ,还可以降低的高度,从而让搜索,插入,删除的性能有所提升,但与此对应的是程序的编码会变得更加复杂,这也是2-3或者2-3-4,在开源框架或日常开发中并不如AVL和红黑使用频繁的原因,但B+除外 ,因为B+是特殊优化后的多路查找,是专门为数据库结合磁盘文件系统定制的。 2-3 VS 二叉搜索 同样的一组数据,在2-3和二叉搜索里面的对比如下: ? 2-3的删除 2-3树节点的删除也会破坏平衡性,同样本身也会产生分裂和合并,如下: ?

    2.3K20发布于 2019-04-28
  • 来自专栏CSDN搜“看,未来”

    浅谈 B+

    目前常见的主要的三种存储引擎是:哈希、B+、LSM。LSM下次再说,hash讲过了。 没有什么B-,那是 B-tree,国内一直翻译成B-,其实就是B。 B我也不想说了,因为已经被升级过了,叫B+。 下图来自 小灰的算法之旅,懂得人自然就懂了: ---- 对比一下B: 这个是B。 ---- B+对于B的改进 1、所有数据都在叶子节点。算法更容易理解了。回头抽空手写一下B+,正好跳表也要重写了。 2、底层叶子节点使用链表串起来了。 这第二个改进不可谓不秀。 单这么看自然是不明所以的,但是凡事都要放在上下文中去看,B+的上下文对应的就是磁盘IO的索引呐,那如果我要范围查询呢?比如说我要上面里面 4-10 的所有数据,B 怎么作为?B+怎么作为?

    53120发布于 2021-10-09
  • 来自专栏IT当时语_青山师_JAVA技术栈

    BB+的区别及MySQL为何选择B+

    BB+的区别及MySQL为何选择B+ 1. BB+的定义 BB+都是一种多路搜索,常用于数据库和文件系统中进行索引操作。在介绍BB+的区别之前,先来了解一下它们的定义。 B+ B+也是一种多路搜索,与B相似,但在B+中,所有的数据都存储在叶子节点中,而非在非叶子节点中。B+满足以下条件: 所有关键字都出现在叶子节点的链表中,且链表中的关键字恰好是有序的。 BB+的区别 BB+虽然都是多路搜索,但它们的区别还是比较明显的。 存储结构 B的非叶子节点中既包含索引,也包含数据,而B+的非叶子节点中只包含索引,数据都存储在叶子节点中。 查询性能 B+的查询性能更优,因为B+的数据都存储在叶子节点中,而B的数据既可能存储在非叶子节点中,也可能存储在叶子节点中。 MySQL采用的是B+作为索引的数据结构,原因如下: B+的查询性能更好,因为数据都存储在叶子节点中,查询时只需要遍历一次叶子节点即可得到查询结果。

    2.2K10编辑于 2023-05-05
  • 来自专栏Android知识点总结

    2-3与红黑

    第一次接触红黑是在关于hashMap,上来就扔五个特性,说满足这五个特点的二分搜索就是红黑。 (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 瞬时懵逼……我扔十个特性,是不是能定义一个红绿灯呢。所以一直不明白红黑为什么要这么定义。 直到今天了解了2-3,才豁然开朗。2-3是一种神奇的,它能够保证该是一个完美2-3可以演化成红黑,这便是保证红黑效率的根本。 先说奇葩的2-3,首先2-3满足二分搜索,但每个节点可能存在1或2个数据,对应的该节点就可能存在2或3个子节点 2-3 ? 2-3引入.png 2-3插入操作: ? 2-3.png 2-3演化为红黑 将三节点拆为两个节点,并将左数据节点设为红色来实现2-3同等功能 ? 红黑.png

    59330发布于 2018-09-29
  • 来自专栏我的技术专刊

    红黑、BB+

    B/B+的索引数量 B 的节点中存储:指针、关键字(主键)、数据 B+ 的非叶子节点:指针、关键字 B+的叶子节点:指针(链表)、关键字、数据 注意,这里不是绝对的,比如有的 B+ 中叶子节点存储的不是数据 而且上述是假设数据为 1KB,如果数据没那么大,高度为 3 的 B 能存储更多的数据,但是如果用在大型数据库索引上还是不够。 B+ B+ 如上图,B+的核心在于非叶子节点不存储数据。 但是这样也是有缺点的: 无论查询结果如何,都必须走到叶子节点才结束,也就是 I/O 次数固定为 O(h) 或者说是 log(n)(底数为节点子分支个数),这个 h 一般为 2-3,排除掉根节点常驻内存, 高度为 3 的 B+ 进行两次 I/O 就可以索引千万级别的数据,高度为 4 的 B+ ,进行 3 次 I/O 就能索引十亿级别的数据量,这个效果还是很好的。 B/B+的优点 更适合磁盘存储,减少了的层级,进而减少 I/O 次数; B B+ 对比 都是 B ,但是 B+更适合范围查询,比如 Mysql,且查询次数很稳定,为 logn。

    95600编辑于 2021-12-05
  • 来自专栏乐行僧的博客

    B-B+,B*

    avl和m为300的B-? avl的高度:log2n = 24层 最差的情况一个节点只存储一个索引? 最差需要24次磁盘IO B-高度:log(300)n = 3 层 最多花费3次磁盘IO B+ B+是B-的一种变形 非叶子结点只存储索引,不存储数据 B+的叶子结点包含全部的关键字信息 ,而B-的数据分散在各个结点当中。 B+存放的索引项相对于B-能够存储的更多。 B* B*B+的变体,在B+的非根和叶子结点在增加指向兄弟结点的指针 B*提高了结点的利用率。

    1.4K30编辑于 2022-02-25
  • 来自专栏java达人

    LSMB+比较

    这就是B+的原理,但是写起来就很糟糕,因为会产生大量的随机IO,磁盘寻道速度跟不上。 关于b B+最大的性能问题是会产生大量的随机io。随着新数据的插入,叶子节点会慢慢分裂。 例如,Oracle 的常用索引使用 B+ 。下面是一个B+的例子 根节点和分支节点很简单,记录每个叶子节点的最小值,用指针指向叶子节点。 关于lsm LSM 本质上是读写之间的平衡。与B+相比,它牺牲了部分读取性能来提高写入性能。 读取的时候,因为我们不知道数据在哪棵树上,所以必须遍历所有的,但是每棵中的数据都是有序的。 以上就是LSM最本质的原理,有了原理,再看具体的技术就很简单了: 关于lsm内存结构,可以是B+,还可以为跳跃表(skip-list)或是一个有序字符串表(SSTables)。

    1.3K20编辑于 2022-05-16
  • 来自专栏花落的技术专栏

    红黑、BB+

    B/B+的索引数量 B 的节点中存储:指针、关键字(主键)、数据 B+ 的非叶子节点:指针、关键字 B+的叶子节点:指针(链表)、关键字、数据 注意,这里不是绝对的,比如有的 B+ 中叶子节点存储的不是数据 而且上述是假设数据为 1KB,如果数据没那么大,高度为 3 的 B 能存储更多的数据,但是如果用在大型数据库索引上还是不够。 B+ B+ 如上图,B+的核心在于非叶子节点不存储数据。 但是这样也是有缺点的: 无论查询结果如何,都必须走到叶子节点才结束,也就是 I/O 次数固定为 O(h) 或者说是 log(n)(底数为节点子分支个数),这个 h 一般为 2-3,排除掉根节点常驻内存, 高度为 3 的 B+ 进行两次 I/O 就可以索引千万级别的数据,高度为 4 的 B+ ,进行 3 次 I/O 就能索引十亿级别的数据量,这个效果还是很好的。 B/B+的优点 更适合磁盘存储,减少了的层级,进而减少 I/O 次数; B B+ 对比 都是 B ,但是 B+更适合范围查询,比如 Mysql,且查询次数很稳定,为 logn。

    1.2K40发布于 2021-11-25
  • 来自专栏Java架构师必看

    BB+、B*——简单介绍

    如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉; 【2】2-3,2-3-4就是多叉,多叉通过重新组织节点,减少的高度,能对二叉进行优化。如下图就是一个2-3; ? 2-3 基本介绍:最简单的 B树结构,具有如下特点:   ■  2-3 的所有叶子节点都在同一层(只要是B都满足这一点);   ■  有两个子节点的叫二节点,二节点要么没有子节点,要么有两个子节点 拆后仍需要满足上述条件;   ■  对于三节点的子树的值的大小仍然遵循(BST:二叉排序)的规则; 2-3 的插入和删除节点案例:链接 B-Tree即B(Balanced:平衡),有人将B-Tree 三、BB+、B* ---- 【1】B介绍:前面介绍的2-3、2-3-4就是 B,在 MySql 中经常听说某种索引是基于 BB+的,如下图: ? 【2】B+介绍:B+ 是B的变体,也是一种多路搜索,如下图: ? 【3】B* 介绍:B* B+的变体,在B+的非根和非叶子节点增加了指向兄弟的指针,如下图: ?

    1.5K20发布于 2021-04-30
  • 来自专栏算法无遗策

    动画 | 什么是红黑?(基于2-3

    学习过2-3之后就知道应怎样去理解红黑了,如果直接看「算法导论」里的红黑的性质,是看不出所以然。 此时我们借着2-3去理解基本的红黑,当然我会在后几篇文章介绍2-3-4以及基于2-3-4的红黑。 抛开上面二分搜索满足红黑的性质,我们知道2-3不是二叉,我们把它转换成一颗二叉,2-节点很好转,3-节点转二叉却有两种,如下图: ? (和2-3等价的,任意节点到其叶子节点的高度都是相同的)。 因为2-3不存在永久的4-节点,4-节点终归要分解的(在2-3-4中,为了更好地插入和删除,4-节点可存在于叶子节点和非叶子节点)2-3一样不行,所以在2-3中没有任何一个节点能同时和两条红链接相连

    1K20发布于 2020-01-02
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    B B- B+ B*

    M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并; B+        B+是B-的变体,也是一种多路搜索:        1.其定义基本与B-同,除了:        2.非叶子结点的子树指针与关键字个数相同 B+的搜索与B-也基本相同,区别是B+只有达到叶子结点才命中(B-可以在 非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;     B+的特性:        1.所有关键字都出现在叶子结点的链表中 是B+的变体,在B+的非根和非叶子结点再增加指向兄弟的指针; ?    B*定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+的1/2);       B+的分裂:   当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点 ;       所有关键字在整颗中出现,且只出现一次,非叶子结点可以命中; B+:在B-基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+总是到叶子结点才命中

    2.2K71发布于 2018-01-17
  • BB+区别

    具体区别1、叶子节点B不存指针,B+存双向指针,方便范围查找2、B非叶子节点也存储数据,B+不存储数据3、B不会有冗余索引,是唯一的,B+会有冗余索引4、存放同样的数据,B的层级比B+要高 ,因为B+有冗余索引,所以相同层级的叶子节点的数据就会更多,(可以有更多的分叉)索引:如果存在主键,主键索引就是聚集索引如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。

    37410编辑于 2024-06-06
  • 来自专栏社区的朋友们

    理解 B+ 算法

    定义 参考百度百科及wiki百科定义:B +是一个N叉排序,每个节点通常有多个孩子,一棵B+包含根节点、内部节点和叶子节点。 B+ 主要价值在于存储用于在面向块的存储环境中高效检索的数据,通常用于数据库和操作系统的文件系统中。B+ 的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。 B+ 元素自底向上插入。 另外说明的一点,B+中的B并不是代表二叉(Binary),而是代表平衡(Balance)。 对于m阶B+,m的值越大,固定高度的B+存放的值就越多。 而B+内部结点只需要1个盘块。当需要把内部结点读入内存中的时候,B 就比B+多一次盘块查找时间(在磁盘中就是盘片旋转寻道的时间)。

    3.1K00发布于 2017-10-20
  • 来自专栏JavaEE

    多叉 & B & B+ & B*

    常见多叉: (1). 2-3: 第二层左边的节点,有两个元素,7和5,它又有3个子节点,这就叫做2-3,其中节点7 5称为3节点,节点9称为2节点。 ? 2-3 2-3是最简单的B,它有以下特点: 首先它也要满足排序的特点,即左子节点都比父节点小,右子节点都比父节点大,如果3节点,那么中间那个元素要介于左节点和右节点之间,即6是介于4和11之间的 B+B+是B的变体,和B的区别就是,B+所有数据都存放在叶子节点。 B+所有的数据都存放在叶子节点的链表中,且链表中的数据也是有序的; 非叶子节点中存放的是索引,而不是要操作的数据,每个非叶子节点都会存放叶子节点的索引,也叫稀疏索引; B+要进行搜素时,从根节点开始 B+一般用于文件系统; 6. B*: B*又是B+的变体,就是在B+的基础上,在非根非叶子节点之间增加了指向兄弟节点的指针。

    1.9K20发布于 2020-12-22
  • 来自专栏性能与架构

    mysql B+索引

    上图就是一棵B+,每个部分有3个主要概念:物理磁盘块、数据项(蓝色)、指针(红色) 如磁盘块1,包含数据项 17、35,包含指针 P1、P2、P3,P1指向小于17的磁盘块,P2指向在17和35之间的磁盘块 真实的数据存于叶子节点中,即 3、5、9、10、13、15、28、29、36、60、75、79、90、99 非叶子节点中并不存放真实数据项,只存放指引搜索方向的数据项,如 17、35 并不真实存在于数据表中 B+ 查找过程 如果要查找数据项29 1. 内存中做二分查找找到29,结束查询 总计三次IO,即可找到目标数据项 3层的B+可以表示上百万的数据,对查询性能的提高是巨大的

    1.1K80发布于 2018-04-02
  • 来自专栏面试

    B+的结构

    阶数与节点容量B+的阶数m决定了节点的子节点数量和键值容量,通常与磁盘页大小对齐以优化I/O 非根节点:键值数范围:⌈m/2⌉−1≤k≤m−1⌈m/2⌉−1≤k≤m−1(如3阶B+,非根节点最多2个键值 与B的区别B+在以下方面区别于B 数据存储位置:B内部节点存数据,B+仅叶子节点存数据。链表结构:B+树叶子节点通过链表连接,B无此设计。 查询稳定性:B+查询必须到叶子节点,路径固定;B可能在内部节点提前终止查询。5. 一棵B+可以存放多少行数据? B-Tree,叶子节点和非叶子节点都保存数据,相同的数据量,B+更矮壮,也是就说,相同的数据量,B+数据结构,查询磁盘的次数会更少。

    84410编辑于 2025-03-18
领券