简单清晰了解B树和B+树

news2024/12/23 5:03:30

一.学习背景

在MySQL的学习中,我们了解到了索引的知识,而关于MySQL索引背后的数据结构,我们在这里进行学习.

首先,我们要了解到的是,MySQL的索引用到的数据结构为B+树.

使用B+树是因为,在数据量大的时候,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。这也正是我们采取B树的原因,普通的二叉树,红黑树等是没法满足这类需求的.所以我们采用新的存储方式.

二叉树是二分树,多分树是二叉树的推广。多分树主要适用于静态的索引数据文件,在插入和删除的时候需要把插入位置之后的每个记录都要向后移动,从而导致增加新的索引项和索引页块,需要对外存上的页块进行大量的调整。因此对于经常需要插入和删除的动态索引顺序文件,使用多分树并不合适,需要采用动态索引结构,即B树和B+树。

二.B树(B-树):

1.B树简介

B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树(B树是一颗多路平衡查找树
它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B树是可以认为是一个N叉搜索树.

B树的出现是为了弥补不同的存储级别之间的访问速度上的巨大差异,实现高效的 I/O。平衡二叉树的查找效率是非常高的,并可以通过降低树的深度来提高查找的效率。但是当数据量非常大,树的存储的元素数量是有限的,这样会导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。另外数据量过大会导致内存空间不够容纳平衡二叉树所有结点的情况。B树是解决这个问题的很好的结构。

2.B树概念:

一棵m阶B树是一棵平衡的m路搜索树,它或者是空树,或者是满足下列性质的树:

  • 树中每个结点至多有m棵子树。(即至多含有m-1个关键字,两颗子树指针夹着一个关键字);
  • 若根结点不是终端结点,则至少有两颗子树。(至少一个关键字);
  • 除根结点外的所有非叶子结点至少有[m/2]棵子树。(即至少含有[m/2]-1个关键字);
  • 所有的叶子结点出现在同一个层次上,不带信息。(就像是折半查找判断树中查找失败的结点)。

 3.B树图示

 由图可知,当节点的子树多了,叶子节点的个数就多了,说明可以保存的key值也变多了

这也就意味着,在保存key值相同个数的条件下,B树的高度相对于二叉搜索树就要低很多.这样的优势非常明显:磁盘 IO 的次数将大大减少!

4.B-树特点:

  1. 所有键值分布在整颗树中(索引值和具体data都在每个节点里)
  2. 任何一个关键字出现且只出现在一个结点中
  3. B树的每个节点可以存储N个key,N个key同时也划分出了N+1个区间

5.B树的查找代码:

Data* BTreeSearch(Root *node, Key key)
{
    Data* data;

    if(root == NULL)
        return NULL;
    data = BinarySearch(node);
    if(data->key == key)
    {
        return data;
    }else{
        node = ReadDisk(data->next);
        BTreeSearch(node, key);
    }
}

二.B+树

1.B+树简介

    B+树是应文件系统所需而产生的B树的变形树,那么可能一定会想到,既然有了B树,又出一个B+树,那B+树必然是有很多优点的。

    B+树在B树上又做出了改进.B+树是B-树的变体,也是一种多路搜索树, 它与 B- 树的不同之处在于:

  1. 所有关键字存储在叶子节点出现,内部节点(非叶子节点并不存储真正的 data)
  2. 为所有叶子结点增加了一个链指针

2.B+树概念

B+树是B树上的一个修改或者改版:

  • n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
  • 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  • 所有的非终端结点可以看成是索引部分,结点中仅含其子树中的大(或小)关键字。
  • B+树中,数据对象的插入和删除仅在叶节点上进行。
  • B+树有2个头指针,一个是树的根节点,一个是小关键码的叶节点。

 3.B+树图示

 

4.B+树特点:

1.B+树的每个节点可以存储N个key,N个key同时也划分出了N个区间(B树是N+1个区间)

2.B+树中每个节点中key的值,都会在子节点中也出现,并且是该子节点的最大值

3.B+树的叶子结点,是首尾相连的,类似于一个链表

4.B+树的叶子结点是完整的数据集合,只会在叶子结点这里存储每一行的数据,而不是叶子结点本身,只需要存储key值即可

三.B树和B+树的比较

B+树的优势:

1.一个节点保存更多的key,最终树的相对高度是更低的,查询的时候减少了IO次数(这点和B树相同)

2.所有的查询最后都会落到叶子节点上(查询任何一个数据,经过的IO访问次数是一样的)确保了稳定性,能够对程序的执行效率有更准确的评估.

3.B+树的所有的叶子结点可以构成链表,方便进行范围查询.

4.由于所有的数据都在叶子节点上,非叶子结点指存储key,这样非叶子节点占用的空间很小,(可能在内存中缓存或缓存一部分),又进一步减少了IO的次数

补充:B树的范围查找用的是中序遍历,而B+树用的是在链表上遍历。

B树和B+树的区别
B树B+树
有m颗子树的节点中含有 m-1 个关键码有m颗子树的节点中含有 m 个关键码

B树中非叶子节点的关键码与叶子结点的关键码均不重复,它们共同构成全部的索引信息

所有的叶子结点中包含了完整的索引信息,包括指向含有这些关键字记录的指针,中间节点每个元素不保存数据,只用来索引
B 树的非叶子节点包含需要查找的有效信息所有的非叶子节点可以看成是高层索引, 结点中仅含有其子树根结点中最大(或最小)关键字

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux命令行与Shell脚本编程】第七章 Linux文件权限

Linux命令行与Shell脚本编程 第七章 Linux文件权限 文章目录 Linux命令行与Shell脚本编程七,Linux文件权限7.1,Linux的安全性7.1.1,用户信息 /etc/passwd文件7.1.2,用户密码 /etc/shadow文件7.1.3,useradd 添加新用户7.1.4,userdel 删除用户7.1.5, 修改用户1,usermod2,passwd…

Hystrix Dashboard图形化监控

👉🏻 SpringCloud 入门实战系列不迷路 👈🏻: SpringCloud 入门实战(一)什么是SpringCloud?SpringCloud 入门实战(二)-SpringCloud项目搭建SpringCloud 入门实…

【云计算•云原生】1.什么是云计算?它为什么这么火?

文章目录 1.云计算基础什么是云计算云计算的分类开源软件、自由软件、免费软件 2.云计算机制云基础设施机制云管理机制云安全机制基本云架构 3.虚拟化技术服务器虚拟化服务器虚拟化技术CPU虚拟化内存虚拟化设备和I/O虚拟化存储虚拟化网络虚拟化桌面虚拟化 KVM 4.网络与存储基础…

90后,第一批接棒白酒的“年轻人”

【潮汐商业评论/原创】 又到了每月的公司团建,“团建必喝酒”似乎已经成为了大家的共识。 但在酒水的选择上,有红的、啤的、洋的,还有低度果酒,唯独不见听谁说聚会喝白的。当Jason询问为什么没有白酒时,得到了几乎一…

C语言函数大全-- o 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- o 开头的函数 1. obstack_init,obstack_free,obstack_alloc,obstack_blank,obstack_grow 1.1 函数说明 函数声明函数功能void obstack_init(struct obstack *obstack_ptr);它是 POSIX …

Python采集某网站小sp内容, m3u8内容下载

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 环境使用: Python 3.8 Pycharm 模块使用: import requests >>> pip install requests import re 正则表达式 解析数据 import json 本次案例所用知识点: python基础语法: 字典创建/取值 print输出函数使用…

【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算

【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算 文章目录 【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算一. RNN简介1.1 概念简介1.2 方法使用简介 二. 编码层embedding2.1 embedding的参数2.2 embedding的理解 三. Linear层与CrossEnt…

全景图像算法简述

全景图像拼接是一种将多个图像合成为一个大型全景图像的技术。这种技术广泛应用于虚拟现实、游戏开发、文化遗产保护等领域。本文将介绍三种主流的全景图像拼接算法,并对它们进行综合比较。 一、基于特征点匹配的拼接算法 特征点匹配是全景图像拼接中最常用的一种算…

深入讲解ARMv8 异常处理简介

内核稳定性问题复杂多样,最常见的莫过于“kernel panic”,意为“内核恐慌,不知所措”。这种情况下系统自然无法正常运转,只能自我结束生命,留下死亡信息。诸如: “Unable to handle kernel XXX at virtual …

直播系统开发中哪些技术架构是必不可少的

在当今数字化时代,直播已成为一种极其受欢迎的娱乐和营销方式。由于直播应用的复杂性,架构师在直播系统的开发和设计中扮演着至关重要的角色。本文将介绍直播系统开发中技术架构师所必不可少的技术和工具。 什么是直播系统? 直播系统是一种通…

uni-app入门到实战

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 🍟欢迎来到前端初见的博文,本文主要讲解uni-app入门到实战🍟 👨‍🔧 个人主页 : 前端初见 🥞喜欢的朋友可以关注一下&#xff…

【Linux】浏览器写代码!部署code-server远程vscode网页

部署code-server远程vscode网页,在浏览器上写代码! 参考文档 https://developer.aliyun.com/article/876967#slide-7 本文首发于 慕雪的寒舍 1.什么是code-server? 注意,这不是在linux系统上安装vscode软件(和windo…

虹科分享 | 如何主动保护个人信息 | 网络安全评级

网上报税和支付越来越流行,针对毫无防备的纳税人的税务欺诈也越来越频繁。以下是一些需要避免的常见网上税务骗局: 网络钓鱼诈骗 骗子利用电子邮件、短信或电话伪装成相关机构或报税软件提供商,诱骗人们提供他们的个人信息,或点击…

走进梦龙冰淇淋的生产线 揭晓“灯塔工厂”背后的秘密

作为一家积极履行社会责任的公司,联合利华和路雪在今年3月携手京东“青绿计划”,推出了包含梦龙、可爱多、千层雪、和路雪等多款可持续组合装产品,这一助力实现双碳目标的举措也引发了消费者的关注。其实,自联合利华太仓食品生产基…

我们都被 ChatGPT 给骗了?

引言: 用过 ChatGPT 的人都知道,当你与 chatgpt 对话的时候,它是“逐字输出”的,就像真的有个人在跟你打字一样。其实,这种技术并没有那么神奇,这种技术叫做“实时文本生成”或“逐字输出”技术&#xff0…

分布式事务Seata-AT模式

承接上文分布式事务-二阶段提交 Seata是开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务,包含AT、TCC、 SAGA、XA四种事务模式,为用户打造一站式的分布式解决方案。 Seata提供的4种事务模式都是由2PC(二阶段提交…

【C++的内联函数】

文章目录 一、什么是内联函数二、内联函数的优缺点三、使用内联函数的注意事项 一、什么是内联函数 用关键字inline修饰的函数叫做内联函数。 C编译器编译时会自动在被调用的地方展开。 二、内联函数的优缺点 内联函数的优点: 没有函数栈帧创建,提升…

干货分享 | 如何在业余时间学习数据分析?

从社会学背景的数分小白到独揽公司市场部的数据分析,和大家简单分享我的数据分析升级打怪之路。 简单说就是两点【培养数据分析思维】【提升数据分析技能】 思维的培养主要靠书籍和课程 以下是一些对我影响较大的书籍,按照【入门、进阶、高阶】简单做了…

torch.nn.Multiheadattention介绍

初始化参数: class torch.nn.MultiheadAttention(embed_dim, num_heads, dropout0.0, biasTrue, add_bias_kvFalse, add_zero_attnFalse, kdimNone, vdimNone, batch_firstFalse, deviceNone, dtypeNone) 允许模型共同关注来自不同表示子空间的信息。 多头注意力…

C#连接数据库失败,ORA-28040: No matching authentication protocol

C#连接数据库失败 1.原先使用的是oracle11,后来升级数据库到oracle19c,启动程序,数据库连接时报错"ORA-28040: No matching authentication protocol" 2.原因分析:最近服务器数据库版本升级到了19c,网上查了…