创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

B-Tree与二叉查找树的对比

LinuxDev 来源:未知 作者:李倩 2018-04-15 10:54 次阅读

什么是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命令显示磁盘空间使用情况

    这 df 命令显示文件系统上的设备名称、总块数、总磁盘空间、已用磁盘空间、可用磁盘空间和挂载点信息。
    的头像 马哥Linux运维 发表于 05-16 11:30 189次 阅读

    库UFX打开文件出错0x1F,请问可能是哪里的问题?

    查询磁片容量大小不对 实际是32G,结果是64G 打开文件的时候,提示 0x1F/* USB存储器操作失败,在初始化时可能是USB存储...
    发表于 05-16 07:31 74次 阅读

    Linux磁盘I/O的性能指标和查看性能工具

    在我之前的文章:《探讨 Linux 的磁盘 I/O》中,我谈到了 Linux 磁盘 I/O 的工作原....
    的头像 马哥Linux运维 发表于 05-14 15:21 532次 阅读

    Buffer和Cache的定义

    但是让我问你,由于 Buffer 只是将写入磁盘的数据的缓存。反过来,它还会缓存从磁盘读取的数据吗?....
    的头像 马哥Linux运维 发表于 05-13 09:53 86次 阅读

    请问CH559UFI.H中的子程序库中的程序在哪里看到?

    /* 子程序库中提供的子程序 */ /* 下述子程序中, 文件操作子程序CH559File*和磁盘查询子程序CH559DiskQuery都可能会用到...
    发表于 05-12 09:45 74次 阅读

    学习使用FFmpeg进行HLS打包

    这里的[v1out]、[v2out]、[v3out]是包含缩放过程的输出变量。注意,这里我们假设缩放....
    的头像 LiveVideoStack 发表于 05-09 10:27 135次 阅读

    二叉树的最小深度

    遍历顺序上依然是后序遍历(因为要比较递归返回之后的结果),但在处理中间节点的逻辑上,最大深度很容易理....
    的头像 算法与数据结构 发表于 04-28 16:27 319次 阅读

    Partclone磁盘备份工具包

    partclone.zip
    发表于 04-28 14:48 25次 阅读
    Partclone磁盘备份工具包

    C语言数据结构:什么是二叉树?

    完全二叉树:完全二叉树是效率很高的数据结构。对于深度为K,有n个节点的二叉树,当且仅当每一个节点都与....
    的头像 C语言编程学习基地 发表于 04-21 16:20 299次 阅读

    如何使用 go 实现红黑树

    二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的....
    的头像 Linux爱好者 发表于 03-21 11:54 322次 阅读

    经济型标准械校准套件参数介绍

    Agilent安捷伦机 经济型/标准械校准套件
    发表于 03-11 14:44 634次 阅读
    经济型标准械校准套件参数介绍

    如何对RK3399 Linux系统的磁盘进行读写测试呢

    如何对RK3399 Linux系统的磁盘进行读写测试呢?
    发表于 03-04 11:37 804次 阅读

    为什么imx6ul-c每次断电df空间都会增加呢

    [root@ /]# df -k Filesystem           1K-blocks      Use...
    发表于 01-10 07:28 638次 阅读

    国产工控机使用时应该注意哪些事项呢?

    工控机具有防尘、防潮、防振、耐高温等特点,在使用时应注意以下事项: 1、在工控机使用过程中,不可拆卸....
    发表于 01-05 17:58 159次 阅读

    window10下的硬盘空间与ubuntu下的磁盘大小

    你好! 我的是OK1012A的开发环境,      我按照文档《OK1012A-C-1GHZ-Ubuntu-用户手册-V1.3-2...
    发表于 01-05 06:55 404次 阅读

    A40i源码编辑无法打开文件是为什么?

    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-22 11:32 540次 阅读

    导致工控机运行速度慢的原因有哪些呢?

    与普通商用计算机相比,工控机的性能更加突出,运行更加稳定,但启动迟缓时,需要考虑是否有故障;可能的因....
    发表于 11-17 15:17 221次 阅读

    如何去完成挂载EMMC并测试读写速度的实验呢

    如何去完成挂载EMMC并测试读写速度的实验呢?...
    发表于 11-10 07:32 425次 阅读

    对 B+ 树与索引在 MySQL 中的认识

    概述 本质:数据库维护某种数据结构以某种方式引用(指向)数据 索引取舍原则:索引的结构组织要尽量减少....
    的头像 数据分析与开发 发表于 11-08 11:11 594次 阅读
    对 B+ 树与索引在 MySQL 中的认识

    嵌入式linux磁盘被写满了再写会出现什么后果

    项目中,测试阶段,开启了某功能项的log日志保存,交互较频发,且无保存上限。一段时间后,导致flash满。此时,有些系统会直接崩...
    发表于 11-05 07:03 263次 阅读

    数据结构与算法分析中的二叉树与堆有关知识汇总

    该资料包括数据结构与算法分析中的二叉树与堆有关的一些知识
    发表于 11-03 09:37 119次 阅读

    中移(苏州)软件技术有限公司获鲲鹏Validated认证

    NEWS 近日,中移(苏州)软件技术有限公司大云软件定义存储平台(后简称“E-SDS”)获鲲鹏Val....
    的头像 华为计算 发表于 11-02 10:22 974次 阅读

    获取电脑可用磁盘和用量信息

    如题,获取电脑可用磁盘名称和用量信息 ...
    发表于 10-31 22:00 2278次 阅读
    获取电脑可用磁盘和用量信息

    二叉排序树AVL如何实现动态平衡

      什么是AVL树 大家好,我是bigsai,好久不见,甚是想念,今天给大家讲讲AVL树。 对于树这....
    的头像 算法与数据结构 发表于 10-28 17:02 557次 阅读
    二叉排序树AVL如何实现动态平衡

    算法学习中如何打印二叉树节点

    大家好,我是吴师兄,直接开始今天的算法学习,冲冲冲。 一、题目描述 从上到下打印出二叉树的每个节点,....
    的头像 算法与数据结构 发表于 10-22 09:37 636次 阅读

    如何修剪二叉搜索树

      如果不对递归有深刻的理解,本题有点难。单纯移除一个节点那还不够,要修剪! 669. 修剪二叉搜索....
    的头像 算法与数据结构 发表于 10-11 14:16 578次 阅读

    innodb究竟是如何存数据的

    前言如果你使用过mysql数据库,对它的存储引擎:innodb,一定不会感到陌生。 众所周知,在my....
    的头像 数据分析与开发 发表于 10-09 15:41 638次 阅读
    innodb究竟是如何存数据的

    C++基础语法中的二叉树详解

    本期是C++基础语法分享的第十四节,今天给大家来梳理一下树!   二叉树 BinaryTree.cp....
    的头像 C语言编程学习基地 发表于 09-29 18:02 1050次 阅读

    西部数据重塑磁盘架构 引领技术拓展

    西部数据公司为满足客户呈指数级增长的数据存储需求,整合HDD与闪存领域的核心技术优势,以革新的磁盘架....
    的头像 话说科技 发表于 09-09 16:58 664次 阅读
    西部数据重塑磁盘架构 引领技术拓展

    深度解读MySQL中的WAL策略和CheckPoint技术

    前段时间我在准备暑期实习嘛,这是当时面携程的时候二面的一道问题,我一脸懵逼,赶紧道歉,不好意思不知道....
    的头像 数据分析与开发 发表于 09-08 12:16 1460次 阅读
    深度解读MySQL中的WAL策略和CheckPoint技术

    如何才能够翻转二叉树

    这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。 但正是因为这道题太简单,一看就会,一....
    的头像 新材料在线 发表于 09-01 11:45 873次 阅读

    C语言编程中如何求出二叉树后序遍历

    题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGD....
    的头像 C语言编程基础 发表于 08-23 11:04 2735次 阅读

    你们知道为什么要分库分表吗

    在文章开头先抛几个问题: (1)什么时候才需要分库分表呢?我们的评判标准是什么? (2)一张表存储了....
    的头像 上海磐启微电子有限公司 发表于 08-16 10:37 807次 阅读

    二叉树的所有路径介绍

    以为只用了递归,其实还用了回溯 257. 二叉树的所有路径 题目地址:https://leetcod....
    的头像 新材料在线 发表于 08-13 17:51 1406次 阅读
    二叉树的所有路径介绍

    Linux内核Page Cache和Buffer Cache两类缓存的作用及关系如何

    在我们进行数据持久化,对文件内容进行落盘处理时,我们时常会使用fsync操作,该操作会将文件关联的脏....
    的头像 Linux阅码场 发表于 07-02 14:25 994次 阅读
    Linux内核Page Cache和Buffer Cache两类缓存的作用及关系如何

    超全解析Linux文件系统之ext2路径名查找

    本文以ext2文件系统为例来剖析一个真实的文件系统如何查找文件,这对于深入理解文件系统至关重要。 1....
    的头像 Linux阅码场 发表于 05-28 17:51 1037次 阅读
    超全解析Linux文件系统之ext2路径名查找

    揭秘allegro线宽、角度、圆弧的切换及右键snap pick to快捷键的设置

    在设计PCB的时候,有些操作会被经常用到,比如改变线宽、旋转(rotate)、镜像(mirror)等....
    的头像 EDA365电子论坛 发表于 05-28 14:36 7149次 阅读

    二叉树的前序遍历非递归实现

    我们之前说了二叉树基础及二叉的几种遍历方式及练习题,今天我们来看一下二叉树的前序遍历非递归实现。 前....
    的头像 算法与数据结构 发表于 05-28 13:59 706次 阅读

    带你认识Kafka背后优秀的架构设计

    消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库,能....
    的头像 Linux爱好者 发表于 04-30 15:45 954次 阅读
    带你认识Kafka背后优秀的架构设计

    如何用脚本来获取linux系统CPU、内存、磁盘IO,及原理解释

    今天主要分享一个shell脚本,用来获取linux系统CPU、内存、磁盘IO等信息。
    的头像 Linux爱好者 发表于 04-08 14:40 1480次 阅读
    如何用脚本来获取linux系统CPU、内存、磁盘IO,及原理解释

    盘点汇总Docker磁盘环境的清理方法

    如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须....
    的头像 如意 发表于 04-05 17:23 730次 阅读

    Microsoft可扩展固件计划和FAT32文件系统规范及FAT磁盘格式概述

    以字符“0x”开头的数字为16进制,若开头没有字符“0x”则表明该数字为10进制。本文的程序使用C语....
    发表于 03-22 14:47 260次 阅读

    FAT32文件系统规范和FAT磁盘格式概述

    FAT(文件分配表)文件系统起源于20世纪70年代末和80年代初,是Microsoft?MS-DOS....
    发表于 03-18 17:35 354次 阅读
    FAT32文件系统规范和FAT磁盘格式概述

    面试官考点之索引是什么?

    可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数等等。为什么不....
    的头像 数据分析与开发 发表于 03-05 10:37 1029次 阅读
    面试官考点之索引是什么?

    RAID磁盘阵列的DIY使用方法和基础知识

    如果DIY让你觉得头疼,说明你的思路是正确的。关注存储且对数据安全比较重视的玩家一定听说过RAID,....
    的头像 如意 发表于 02-24 11:50 2418次 阅读
    RAID磁盘阵列的DIY使用方法和基础知识

    Win10 19H1快速预览版更新18312的具体内容

    在19H1中,微软对Windows 10的磁盘空间管理进行了一些更改。通过预留存储,将留出一些磁盘空....
    的头像 倩倩 发表于 02-24 11:35 855次 阅读

    Windows.old文件夹删不掉,怎么办?

    最近有朋友向笔者反馈Win10的一个蛋疼问题,这位朋友最近重装了系统,发现系统盘目录下有一个“Win....
    的头像 lhl545545 发表于 02-18 09:09 4402次 阅读

    讲解Linux之快速查找被删除的文件

    日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Ce....
    的头像 如意 发表于 02-04 16:29 2356次 阅读
    讲解Linux之快速查找被删除的文件

    固态硬盘有哪些类型?

    由于SATA技术而被限制为600 MB / s的SATA SSD模式,被称为最慢的SSD类型。支持N....
    的头像 倩倩 发表于 02-02 10:05 7279次 阅读

    win10的磁盘修复应该如何解决

    就拿联想Air14笔记本电脑来说,在Windows10系统下,win10的硬盘已经被修好了,建议用户....
    的头像 Wildesbeast 发表于 01-17 09:43 2424次 阅读

    Windows为何只支持32GB的FAT32分区?

    你是不是被一个问题困扰着,那就是Windows为何只支持32GB的FAT32分区? 现已退休的微软工....
    的头像 工程师邓生 发表于 01-06 15:59 1387次 阅读

    Windows 10新增磁盘分析工具

    微软正在开发一个名为DiskUsage的新命令行工具,该工具可以帮助用户便捷地了解Windows 1....
    的头像 如意 发表于 12-30 10:14 1514次 阅读

    微软将推出 Win10 新版磁盘分析功能:搜寻占用空间最大的文件夹

    12月30日消息据外媒 WindowsLatest 报道,微软正在开发一个名为 DiskUsage ....
    的头像 工程师邓生 发表于 12-30 10:03 1237次 阅读

    MySQL磁盘满了应该如何解决

    本文档的主要内容详细介绍的是MySQL磁盘满了应该如何解决。
    发表于 12-26 10:25 763次 阅读

    win10扫描磁盘引发蓝屏死机的解决方法

    Win10又爆出蓝屏死机Bug啦!每次Win10更新,似乎总会带来一些莫名其妙的问题,这次也不例外。....
    的头像 如意 发表于 12-24 11:49 2668次 阅读

    Win10解决SSD磁盘文件损坏和无法启动问题

    本月早些时候的周二更新日,微软发布了面向部分Windows 10版本的补丁。虽然这些更新带来了常见的....
    的头像 工程师邓生 发表于 12-22 11:56 3193次 阅读

    国产桌面UOS新版发布,新增三大功能

    近日,统信软件官方发布了最新版的桌面操作系统UOS专业版V20(1030),相比之前的1022版本功....
    的头像 如意 发表于 12-18 10:09 1901次 阅读