当前位置: 首页 > news >正文

B-树和B+树的区别

B-树和B+树的区别

一、B-tree数据存储

在下图中 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数据结构实现过程

在这里插入图片描述

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

1. 对比B树的数据存储结构可以看到: B+Tree 所有的叶子节点之间是一种链式环结构。
2. B+树非叶子节点不存储data数据,只存储主键数据以及相关指针数据。

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

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

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

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

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

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

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

那么在 B+Tree 中三层可以存储的数据就是 1600160016=40960000
足以见得,B+Tree四层时已经是40960000 * 1600 条数据,足以见得已经能够满足绝大部分数据存储需求

可见:
1.B树索引结构,InnoDB引擎三次磁盘IO只能查到4096条数据,而B+树索引结构三次磁盘IO能够查到40960000.相差万倍;
2.innodb对磁盘默认一次读取16KB字节大小,Linux系统默认读取4KB字节大小。故InnoDB在说IO磁盘操作时是Linux系统磁盘操作次数的四倍。

http://www.lryc.cn/news/131396.html

相关文章:

  • c注册cpp回调函数
  • 批量将excel中字段为“八百”替换成“九百”
  • 关于docker-compose up -d在文件下无法运行的原因以及解决方法
  • 机器学习笔记 - 基于keras + 小型Xception网络进行图像分类
  • 【Unity每日一记】SceneManager场景资源动态加载
  • 自动驾驶数据回传需求
  • 使用Jmeter自带recorder代理服务器录制接口脚本
  • 我和 TiDB 的故事 | 远近高低各不同
  • 深入浅出Pytorch函数——torch.nn.init.zeros_
  • Jenkins-发送邮件配置
  • 网络通信原理传输层TCP三次建立连接(第四十八课)
  • 【Python机器学习】实验14 手写体卷积神经网络(PyTorch实现)
  • Debian查询硬件状态
  • 除自身以外数组的乘积(c语言详解)
  • ONES × 鲁邦通|打造研发一体化平台,落地组织级流程规范
  • 【GaussDB】 SQL 篇
  • rn和flutter出现“Running Gradle task ‘assembleDebug
  • Shell脚本基础( 四: sed编辑器)
  • 微信消息没通知iphone can‘t show notifications
  • Linux Kernel:pid与namespace
  • 开源后台管理系统Geekplus Admin
  • 【MATLAB基础绘图第16棒】绘制热图(Heatmap)
  • 数据库--SQL关键字的执行顺序
  • 如何优雅地处理Java多线程编程中的共享资源问题,以确保线程安全和高性能?
  • 每天一道leetcode:剑指 Offer 64. 求1+2+…+n(中等递归)
  • 服务器安装centos7踩坑
  • Java | IDEA中 jconsole 不是内部或外部命令,也不是可运行的程序
  • 将Swift Package构建为通用二进制文件 Universal Binary
  • 正则表达式:贪婪与非贪婪模式
  • UVa247 Calling Circles(Floyd warshall算法)