一文看懂B TREE和B+TREE数据结构实现过程及数据存储结构

概述

一文看懂B TREE和B+TREE数据结构实现过程及数据存储结构

一、B tree数据结构实现过程

这里有一个陌生区关于 Max. Degree,这个你可以理解为阶,也可以理解为度,即B+ 树的阶数(一个节点存储的键的数量)

这里有一个陌生区关于 Max. Degree,这个你可以理解为阶,也可以理解为度,即B+ 树的阶数(一个节点存储的键的数量)

1、插入数据

现在可以看到目前只插入了 3 条数据:

再加一条数据,节点就会进行分裂,这个也就验证了当阶设置为 n 时,一个节点可存 n-1 条数据

  想要达到快速检索数据,那就需要满足俩个特性,一个是有序,另一个就是平衡。

 从下图中可以看到 BTree 是有一定的顺序性的,平衡性更满足

2、查找数据

查找数据为9的过程如下:

当查找数值9,首先看到的数据是 4,9 是大于 4 的,所以会往 4 的右节点寻找。继续找到范围在 6 到 8 的节点,9 又大于 8,所以还需要往右节点寻找,最有一步就找到了数据 9,这个过程就是 BTree 数据结构查找数据的执行过程。

 

 

 查找数据为6的过程如下:
当查找数值6,首先看到的数据是 4,6 是大于 4 的,所以会往 4 的右节点寻找。继续找到范围在 6 到 8 的节点,然后就找到了数据6,此时只需要2次IO。

 

3、删除数据

假设删除数据为6的记录,过程如下:

 

 

 删除数据为7的记录,过程如下:

 

二、Btree数据存储

在下图中 P 代表的是指针,指向的是下一个磁盘块。在第一个节点中的 16、24 就是代表我们的 key 值是什么。date 就是这个 key 值对应的这一行记录是什么。

 假设寻找 key 为 33 的这条记录,33 在 16 和 34 中间,所以会去磁盘 3 进行寻找。

在磁盘 3 中进行判断,指针指向磁盘 8。在磁盘 8 中即可获取到数据 33,然后将 data 返回。

一般说到的页都是数据页。默认的页面大小为16kb,每个页中至少存储2条或以上的行记录。那么根据 BTree 数据查找的过程中可以得知一共读取了三个磁盘,那么每个磁盘的大小就是 16kb。

而目前的给的案例寻找了三层,那么三层存储的数据就是:16kb16kb16kb=4096kb。
如果按照一条记录所需内存 1kb,那么这三层的 BTree 就可以存储 4096 条记录。

数据库的数据少则几百万,多则几千万数据,那么 BTree 的层级就会越来越深,相对的查询效率也会越来越慢。

这里就要考虑为什么在 Btree 中 48kb 的内存怎么就只能存储 4000 多条记录?

问题就出现在 data 上,要知道在计算数据大小时指针地址和 key 的内存都是没有计算在内的,单单就计算了 data 的内存。

问题就出现在 data 上,要知道在计算数据大小时指针地址和 key 的内存都是没有计算在内的,单单就计算了 data 的内存。

三、B+ Tree数据结构实现过程

1、插入数据

可以看到目前只插入了 3 条数据:

在这里插入图片描述再插入一条数据

在这里插入图片描述 

共插入十条记录,结构如下:

在这里插入图片描述 2、查找数据

当查找数值9,首先看到的数据是 4,9 是大于 4 的,所以会往 4 的右节点寻找。继续找到范围在 6 到 8 的节点,9 又大于 8,所以还需要往右节点寻找,最有一步就找到了数据 9,这个过程就是 B+Tree 数据结构查找数据的执行过程。
演变过程如下:

在这里插入图片描述

在这里插入图片描述 

在这里插入图片描述 

 当查找数值为5的过程,如下:
当查找数值5,首先看到的数据是 7,5 是小于 7 的,所以会往 7 的左节点寻找。继续找到范围在 3 到 5 的节点,然后再往右节点寻找,最后在叶子结点找到了数据 5,总共需要3次IO。

在这里插入图片描述

3、删除数据

假设删除数据为6的记录,过程如下:

在这里插入图片描述

在这里插入图片描述 

 在这里插入图片描述

在这里插入图片描述 

在这里插入图片描述 

在这里插入图片描述 

在这里插入图片描述 

在这里插入图片描述 

在这里插入图片描述

四、B+Tree存储

在这里插入图片描述 

对比B树的数据存储结构可以看到:

  1. 对比B树的数据存储结构可以看到:
  2. B+Tree 所有的叶子节点之间是一种链式环结构。

那么在这个过程中到底读取了多少条数据呢?

假设B+Tree 读取数据的深度跟 B-Tree 的深度一样,都是三层,那么同样的道理每个磁盘的大小为 16kb。

那在 B+Tree 中非叶子节点可以存储多少数据呢?一般来说我们每个表都会存在一个主键。

根据三层来计算,第一层跟第二层存储的是 key 值,也就是主键值。

由于 int 类型所占的内存是 4Byte(字节),指针的存储就给个 6Byte,一共就是 10Tybe,那么第一层节点就可以存储 161000/10=1600。

同理第二层每个节点也是可以存储 1600 个 key。

第三层是叶子节点,每个磁盘存储大小同样安装 BTree 的计算一样,每条数据占 1kb。

**那么在 B+Tree 中三层可以存储的数据就是 16001600*16=40960000。**

从这点来看 B+Tree 存储的数据跟 BTree 存储的数据根本就不是一个级别,这样大家就知道为什么MySQL数据库要用B+树了吧~

原文: 

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

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

相关文章

mysql 是否包含 返回索引 截取字符串

是否包含返回索引 原文链接:https://www.cnblogs.com/shoshana-kong/p/16474175.html 方法1:使用通配符%。 通配符也就是模糊匹配,可以分为前导模糊查询、后导模糊查询和全导匹配查询,适用于查询某个字符串中是否包含另一个模糊…

sql 抛出异常raiserror()

说明 用于抛出一个异常或错误。这个错误可以被程序捕捉到。 实例 declare error_mes varchar(1000) set error_mes1314520886的ERP_ICStockBillEntry中间表数据的收料仓库编码不存在于系统中 raiserror(error_mes,13,1,张三)输出

SQL 中 RAISERROR 的用法

raiserror 是由单词 raise error 组成 raise 增加; 提高; 提升 raiserror 的作用 : raiserror 是用于抛出一个错误。[ 以下资料来源于sql server 2005的帮助 ] 其语法如下: RAISERROR ( { msg_id | msg_str | local_variable } …

raiserror的用法

描述:raiserror :是用于抛出一个错误 第一个参数:{ msg_id | msg_str | local_variable } msg_id:表示可以是一个sys.messages表中定义的消息代号; 使用 sp_addmessage 存储在 sys.messages 目录视图中的用户定义错误消…

SQL Server抛出异常信息 RAISERROR

用于数据库抛出具体异常信息给程序,示例:BEGIN TRY /* RAISERROR (Error raised in TRY block., -- Message text. 16, -- Severity. 1 -- State. ); */ DECLARE x INT9; DECLARE y INT 0; SELEC…

iOS 自动化测试踩坑(一): 技术方案、环境配置与落地实践

【摘要】 移动端的自动化测试,最常见的是 Android 自动化测试,我个人觉得 Android 的测试优先级会更高,也更开放,更容易测试;而 iOS 相较于 Android 要安全稳定的多,但也是一个必须测试的方向,这…

秒懂SQL SERVERE 数据库中RAISERROR的基本用法

基本用法 raiserror(msg,severity,state)一、msg 错误信息。 二、severity 错误信息的级别,我们可以指定 0 到 18 之间的严重级别。 只有 sysadmin 固定服务器角色成员或具有 ALTER TRACE 权限的用户才能指定 19 到 25 之间的严重级别。若要使用 19 到 25 之间的严…

SQL Server研习录(23)——RAISERROR()函数

SQL Server研习录(23)——RAISERROR函数 版权声明一、RAISERROR()函数1、基本语法 版权声明 本文原创作者:清风不渡博客地址:https://blog.csdn.net/WXKKang 一、RAISERROR()函数 概念:生成错误消息并启动会话的错误处…

python 创建Django项目基础

一. 安装Django pip install django 默认安装最新版本二. 创建一个Django项目 三、运行项目 创建好Django项目后,我们就可以运行了 使用命令 python manage.py runserver四、目录结构 五、创建一个文件views用来存放方法 在创建的文件中写入以下方法 def sa…

[5]PCB设计实验|卷积神经网络基础|零基础入门深度学习(4) 卷积神经网络|14:00~14:55

资料来源:零基础入门深度学习(4) - 卷积神经网络 - 作业部落 Cmd Markdown 编辑阅读器 目录 1. Relu激活函数 2. 全连接网络VS卷积网络 3. 卷积神经网络 3.1 网络架构 3.2 三维的层结构 4. 卷积神经网络输出值的计算 5. Pooling层输出值的计算 6. 全连…

WebGIS学习-01-GIS基础概念与Mapbox基础

1.地图数据来源 1.栅格数据: -.jpg,.png等图片数据; -卫星等拍摄的影像;.tiff 2.矢量数据: -geojson的数据,多用于绘制边界 -放大缩小都不会失真,且高度支持手绘 2.网页是如何渲染地图数据的 …

【Log】大三的最后一个项目,所以我到底是不是恋爱脑?

文章目录 梦开始的地方核心功能恋爱相册(LoveAlbum)恋爱日志(LoveLogs)爱情邮局(LovePostOffice)时间线(TimeLine)待办列表(LoveList) 技术栈 梦开始的地方 …

Web端3D模型轻量化工具如何实现建筑行业“数字化”建设?

随着数字化技术的飞速发展,建筑行业也在不断寻找新的技术手段来提供高产能和建筑质量。其中,Web端3D模型轻量化工具HOOPS Communicator SDK在建筑行业中的应用不断地得到了市场的广泛注意和应用。本文将深入探讨HOOPS Communicator在建筑行业中的应用及其…

初心不改凌云志 热血浇灌信仰花 《凭栏一片风云起》湖北卫视热力开播

浮光灼夏 御风而行, 由著名导演金琛执导, 胡一天、章若楠、王劲松 张晞临、张赫、林子璐领衔主演, 高伟光特邀出演的 年代战争剧《凭栏一片风云起》, 将于今晚19:30起, 登陆【湖北卫视】长江剧场。 电视剧《凭栏…

C++之stack容器

一、概念 概念: stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口&#xff1b; 二、代码 #include <iostream> #include <stack>using namespace std;// 栈数据操作 概念: stack是一种先进后出(First In Last Out,FILO)的数据结…

SqlTransaction——事务详解

Posted on 2008-07-20 01:46 停留的风 http://www.cnblogs.com/yank/archive/2008/07/20/1246896.html 事务处理基本原理 事务是将一系列操作作为一个单元执行&#xff0c;要么成功&#xff0c;要么失败&#xff0c;回滚到最初状态。在事务处理术语中&#xff0c;…

sql server 2005 T-SQL BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。 Transact-SQL 语法约定 语法 BEGIN DISTRIBUTED { TRAN | TRANSACTION } [ transaction_name | tran_name_variable ] [ ; ] 参数 transaction_name 用户定义的事务名&#x…

编写Transact-SQL语句

适用于&#xff1a; SQL Server Azure SQL数据库Azure Synapse Analytics&#xff08;SQL DW&#xff09;并行数据仓库 欢迎使用《编写Transact-SQL语句》教程。本教程适用于刚编写SQL语句的用户。通过检查一些有关创建表和插入数据的基本语句&#xff0c;它将帮助新用户开始…

SQL transaction事物以及各种锁、waitfor、脏读、幻读

事务定义 数据库事务(Database Transaction)&#xff0c;是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完全地不执行。 简单的说&#xff1a;事务就是将一堆的SQL语句(通常是增删改操作)绑定在一起执行&#xff0c;要么都执行成功&am…

SQL 之 事务(Transaction)

SQL 之 事务 一、什么是事务&#xff1f;二、事务的四大特性(ACID)1. 原子性(Atomicity)2. 一致性(Consistency)3. 隔离性(Isolation)4. 持久性(Durability) 三、并发事务带来的问题1. 脏读(Dirty read)2. 修改丢失(Lost to modify)3. 不可重复读(Unrepeatableread)4. 幻读(Pha…