什么是B-Tree
B-Tree就是我们常说的B树,一定不要读成B减树,否则就很丢人了。B树这种数据结构常常用于实现数据库索引,因为它的查找效率比较高。
磁盘IO与预读
磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘IO的时间,大概9ms左右。这个成本是访问内存的十万倍左右;正是由于磁盘IO是非常昂贵的操作,所以计算机操作系统对此做了优化:预读;每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中。因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。
B-Tree与二叉查找树的对比
我们知道二叉查找树查询的时间复杂度是O(logN),查找速度最快和比较次数最少,既然性能已经如此优秀,但为什么实现索引是使用B-Tree而不是二叉查找树,关键因素是磁盘IO的次数。
数据库索引是存储在磁盘上,当表中的数据量比较大时,索引的大小也跟着增长,达到几个G甚至更多。当我们利用索引进行查询的时候,不可能把索引全部加载到内存中,只能逐一加载每个磁盘页,这里的磁盘页就对应索引树的节点。
一、 二叉树
我们先来看二叉树查找时磁盘IO的次:定义一个树高为4的二叉树,查找值为10:

第一次磁盘IO:

第二次磁盘IO

第三次磁盘IO:

第四次磁盘IO:

从二叉树的查找过程了来看,树的高度和磁盘IO的次数都是4,所以最坏的情况下磁盘IO的次数由树的高度来决定。
从前面分析情况来看,减少磁盘IO的次数就必须要压缩树的高度,让瘦高的树尽量变成矮胖的树,所以B-Tree就在这样伟大的时代背景下诞生了。
二、B-Tree
m阶B-Tree满足以下条件:
1、每个节点最多拥有m个子树
2、根节点至少有2个子树
3、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
4、所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列
如下有一个3阶的B树,观察查找元素21的过程:

第一次磁盘IO:

第二次磁盘IO:

这里有一次内存比对:分别跟3与12比对
第三次磁盘IO:

这里有一次内存比对,分别跟14与21比对
从查找过程中发现,B树的比对次数和磁盘IO的次数与二叉树相差不了多少,所以这样看来并没有什么优势。
但是仔细一看会发现,比对是在内存中完成中,不涉及到磁盘IO,耗时可以忽略不计。另外B树种一个节点中可以存放很多的key(个数由树阶决定)。
相同数量的key在B树中生成的节点要远远少于二叉树中的节点,相差的节点数量就等同于磁盘IO的次数。这样到达一定数量后,性能的差异就显现出来了。
三、B树的新增
在刚才的基础上新增元素4,它应该在3与9之间:



四、B树的删除
删除元素9:


五、总结
插入或者删除元素都会导致节点发生裂变反应,有时候会非常麻烦,但正因为如此才让B树能够始终保持多路平衡,这也是B树自身的一个优势:自平衡;B树主要应用于文件系统以及部分数据库索引,如MongoDB,大部分关系型数据库索引则是使用B+树实现。
原文标题:什么是B-Tree
文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。
相关推荐
这 df 命令显示文件系统上的设备名称、总块数、总磁盘空间、已用磁盘空间、可用磁盘空间和挂载点信息。
查询磁片容量大小不对 实际是32G,结果是64G
打开文件的时候,提示 0x1F/* USB存储器操作失败,在初始化时可能是USB存储...
发表于 05-16 07:31 •
74次
阅读
在我之前的文章:《探讨 Linux 的磁盘 I/O》中,我谈到了 Linux 磁盘 I/O 的工作原....
但是让我问你,由于 Buffer 只是将写入磁盘的数据的缓存。反过来,它还会缓存从磁盘读取的数据吗?....
/* 子程序库中提供的子程序 */
/* 下述子程序中, 文件操作子程序CH559File*和磁盘查询子程序CH559DiskQuery都可能会用到...
发表于 05-12 09:45 •
74次
阅读
这里的[v1out]、[v2out]、[v3out]是包含缩放过程的输出变量。注意,这里我们假设缩放....
遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
partclone.zip
发表于 04-28 14:48 •
25次
阅读
完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
Agilent安捷伦机 经济型/标准械校准套件
发表于 03-11 14:44 •
634次
阅读
如何对RK3399 Linux系统的磁盘进行读写测试呢?
发表于 03-04 11:37 •
804次
阅读
[root@ /]# df -k
Filesystem 1K-blocks Use...
发表于 01-10 07:28 •
638次
阅读
工控机具有防尘、防潮、防振、耐高温等特点,在使用时应注意以下事项: 1、在工控机使用过程中,不可拆卸....
发表于 01-05 17:58 •
159次
阅读
你好! 我的是OK1012A的开发环境,
我按照文档《OK1012A-C-1GHZ-Ubuntu-用户手册-V1.3-2...
发表于 01-05 06:55 •
404次
阅读
A40i源码编辑成功打包
MBR大小= 16384
MBR魔法softw411
磁盘=引导资源
文件名=启动resource.f
dl_file_size = 106...
发表于 01-04 06:28 •
541次
阅读
存储管理的磁盘结构分为哪几部分?
磁盘调度算法有哪几种?分别有何优缺点?
...
发表于 12-23 09:57 •
500次
阅读
工业现场环境复杂,工控机工作时面临振动,灰尘,高电磁场干扰等因素,工业现场经常长时间连续工作,对工业....
发表于 12-06 17:49 •
267次
阅读
二叉树上应该怎么求,二叉搜索树上又应该怎么求? 在求众数集合的时候有一个技巧,因为题目中众数是可....
与普通商用计算机相比,工控机的性能更加突出,运行更加稳定,但启动迟缓时,需要考虑是否有故障;可能的因....
发表于 11-17 15:17 •
221次
阅读
如何去完成挂载EMMC并测试读写速度的实验呢?...
发表于 11-10 07:32 •
425次
阅读
概述 本质:数据库维护某种数据结构以某种方式引用(指向)数据 索引取舍原则:索引的结构组织要尽量减少....
项目中,测试阶段,开启了某功能项的log日志保存,交互较频发,且无保存上限。一段时间后,导致flash满。此时,有些系统会直接崩...
发表于 11-05 07:03 •
263次
阅读
该资料包括数据结构与算法分析中的二叉树与堆有关的一些知识
发表于 11-03 09:37 •
119次
阅读
NEWS 近日,中移(苏州)软件技术有限公司大云软件定义存储平台(后简称“E-SDS”)获鲲鹏Val....
华为计算 发表于 11-02 10:22
•
974次
阅读
如题,获取电脑可用磁盘名称和用量信息
...
发表于 10-31 22:00 •
2278次
阅读
什么是AVL树 大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。 对于树这....
大家好,我是吴师兄,直接开始今天的算法学习,冲冲冲。 一、题目描述 从上到下打印出二叉树的每个节点,....
如果不对递归有深刻的理解,本题有点难。单纯移除一个节点那还不够,要修剪! 669. 修剪二叉搜索....
前言如果你使用过mysql数据库,对它的存储引擎:innodb,一定不会感到陌生。 众所周知,在my....
本期是C++基础语法分享的第十四节,今天给大家来梳理一下树! 二叉树 BinaryTree.cp....
西部数据公司为满足客户呈指数级增长的数据存储需求,整合HDD与闪存领域的核心技术优势,以革新的磁盘架....
话说科技 发表于 09-09 16:58
•
664次
阅读
前段时间我在准备暑期实习嘛,这是当时面携程的时候二面的一道问题,我一脸懵逼,赶紧道歉,不好意思不知道....
这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。 但正是因为这道题太简单,一看就会,一....
新材料在线 发表于 09-01 11:45
•
873次
阅读
题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGD....
在文章开头先抛几个问题: (1)什么时候才需要分库分表呢?我们的评判标准是什么? (2)一张表存储了....
以为只用了递归,其实还用了回溯 257. 二叉树的所有路径 题目地址:https://leetcod....
新材料在线 发表于 08-13 17:51
•
1406次
阅读
在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏....
本文以ext2文件系统为例来剖析一个真实的文件系统如何查找文件,这对于深入理解文件系统至关重要。 1....
在设计PCB的时候,有些操作会被经常用到,比如改变线宽、旋转(rotate)、镜像(mirror)等....
我们之前说了二叉树基础及二叉的几种遍历方式及练习题,今天我们来看一下二叉树的前序遍历非递归实现。 前....
消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库,能....
今天主要分享一个shell脚本,用来获取linux系统CPU、内存、磁盘IO等信息。
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须....
如意 发表于 04-05 17:23
•
730次
阅读
以字符“0x”开头的数字为16进制,若开头没有字符“0x”则表明该数字为10进制。本文的程序使用C语....
发表于 03-22 14:47 •
260次
阅读
FAT(文件分配表)文件系统起源于20世纪70年代末和80年代初,是Microsoft?MS-DOS....
发表于 03-18 17:35 •
354次
阅读
可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数等等。为什么不....
如果DIY让你觉得头疼,说明你的思路是正确的。关注存储且对数据安全比较重视的玩家一定听说过RAID,....
如意 发表于 02-24 11:50
•
2418次
阅读
在19H1中,微软对Windows 10的磁盘空间管理进行了一些更改。通过预留存储,将留出一些磁盘空....
倩倩 发表于 02-24 11:35
•
855次
阅读
最近有朋友向笔者反馈Win10的一个蛋疼问题,这位朋友最近重装了系统,发现系统盘目录下有一个“Win....
日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Ce....
如意 发表于 02-04 16:29
•
2356次
阅读
由于SATA技术而被限制为600 MB / s的SATA SSD模式,被称为最慢的SSD类型。支持N....
倩倩 发表于 02-02 10:05
•
7279次
阅读
就拿联想Air14笔记本电脑来说,在Windows10系统下,win10的硬盘已经被修好了,建议用户....
你是不是被一个问题困扰着,那就是Windows为何只支持32GB的FAT32分区? 现已退休的微软工....
工程师邓生 发表于 01-06 15:59
•
1387次
阅读
微软正在开发一个名为DiskUsage的新命令行工具,该工具可以帮助用户便捷地了解Windows 1....
如意 发表于 12-30 10:14
•
1514次
阅读
12月30日消息据外媒 WindowsLatest 报道,微软正在开发一个名为 DiskUsage ....
工程师邓生 发表于 12-30 10:03
•
1237次
阅读
本文档的主要内容详细介绍的是MySQL磁盘满了应该如何解决。
发表于 12-26 10:25 •
763次
阅读
Win10又爆出蓝屏死机Bug啦!每次Win10更新,似乎总会带来一些莫名其妙的问题,这次也不例外。....
如意 发表于 12-24 11:49
•
2668次
阅读
本月早些时候的周二更新日,微软发布了面向部分Windows 10版本的补丁。虽然这些更新带来了常见的....
工程师邓生 发表于 12-22 11:56
•
3193次
阅读
近日,统信软件官方发布了最新版的桌面操作系统UOS专业版V20(1030),相比之前的1022版本功....
如意 发表于 12-18 10:09
•
1901次
阅读
评论