看了还不懂b+tree的本质就来打我

tree,本质 · 浏览次数 : 1404

小编点评

## b+tree 的本质和相关知识 **什么是 b+tree?** b+tree 是一种用于高效存取磁盘数据的结构,它是一种平衡的二叉树。简单来说,它是一种能有效解决磁盘存取问题的数据结构。 **b+tree 的优势:** * 存储效率高,可以将磁盘上的所有数据均匀分布在多个节点上,从而实现高效的存取。 * 存储方式简单,易于实现,可以轻松地根据文件内容进行存储和访问。 * 具有良好的搜索性能,可以快速找到目标节点。 **b+tree 的缺点:** * 在存储数据之前,需要进行排序,这会消耗一定的时间。 * 索引的建立和维护会降低检索效率。 **b+tree 的写入过程:** 1. 从根节点开始,依次访问每个分支节点,直到找到目标节点。 2. 在目标节点存储数据。 3. 更新节点的指针,以指向新数据节点。 **b+tree 的一些应用场景:** * 数据库索引 * 文件系统 * 索引树 ## b+tree 和文件系统的关系 b+tree 是文件系统中用于存储数据的关键数据结构。数据库通过文件系统读取和写入磁盘上的数据,而 b+tree 是数据库中用于存储索引的结构。 ## b+tree 的与 LSM 的区别 LSM 是另一种用于构建索引的数据结构,它具有比 b+tree 更高的写入性能,但 sacrifice 了读取性能。 **LSM 的优点:** * 写入性能好 * 读取性能好 **LSM 的缺点:** * 存储效率不如 b+tree * 索引的建立和维护成本更高 ## b+tree 的写入性能分析 b+tree 的写入性能受以下因素影响: * 索引的建立和维护 * 写入操作的效率 * 磁道之间的移动 **索引的建立和维护:** * 在建立索引的过程中,需要对数据进行排序,这会消耗一定的时间。 * 在索引的维护过程中,需要不断更新节点的指针和数据。 **写入操作的效率:** * 在写数据到 b+tree 中时,需要找到目标节点,并将其指针指向新的数据节点。 * 这可能会导致多个磁盘访问,从而影响写入性能。 ## 总结 b+tree 是一个非常有效的磁盘存储结构,它可以有效地解决磁盘存取问题。但它也有一些缺点,例如写入性能可能不高。

正文

看了还不懂b+tree的本质就来打我

数据检索系列视频

大家好,我是蓝胖子。

今天我们来看看b+tree这种数据结构,我们知道数据库的索引就是由b+tree实现,那么这种结构究竟为什么适合磁盘呢,它又有哪些缺点呢?

我将不会对b+tree的一些定义做过多的讲解,因为这些东西网上一大推,关键还是要抓住本质,想想为什么b+tree这么设计 ?

b+tree,磁盘,文件系统之间的关系

要想理解b+tree的本质,一定要理解如何在磁盘上高效的存取数据。先看下磁盘是如何读取数据的。
来看下磁盘的结构图。

磁盘结构.png

这是磁盘的一个柱面,读数据的时候,就是磁头来回左右的移动。柱面中一圈圈的叫做磁道,每个磁道都被切分为一个个扇区,磁盘读取的单位就是一个扇区一个扇区的读取。而如果要读取的数据在不同的磁道,就需要磁头前后移动到达指定磁道后再移动到特定扇区进行读取,而磁道的变换就是磁盘读取最耗时的过程

所以对于磁盘怎样加速读取呢?

终极目的要尽量减少存取时不同磁道间的切换,如何减少切换开销?也很简单,往磁盘写入数据时尽可能在同一个磁道上写,从读取读取数据时,也保证尽可能在同一个磁道上读。

但平时我们并不直接操作磁盘,而是通过文件系统往磁盘上写入和读取数据,文件系统每次读取是按块为单位,一个块往往是多个连续的扇区构成。注意连续的扇区是为了减少磁道切换的开销

文件磁盘.png

从磁盘上找文件需要找到文件inode数据块,再从inode数据块中找到文件具体的数据块置,可以简单把一个文件理解为一个个文件块构成的,如图每个块都有自己的编号,这里的编号是连续的,实际上,分配的文件块编号也可以不连续。

那么文件系统和b+tree的关系是什么呢?

数据库也是通过文件系统去读取磁盘上的数据的,而数据库中读取数据的单位是一页,不过这个一页数据大小是文件块的整数倍(例如mysql数据页是16kb,而一般操作系统是4kb)。并且数据库实现索引时,会让b+tree中一个节点的大小刚好占用一页数据的大小

这里其实又会产生一个疑问?如果大小是文件块的整数倍,那么一个btree节点的所占的空间也就是数据库一个数据页所占的空间 在磁盘上一定是连续的吗,答案为 近乎是连续的,因为文件系统在一次性分配文件块时,为了提升文件系统的性能,即减少磁道的变化,会倾向于连续分配。

比如我们告诉操作系统,往一个文件里写入16kb的数据,那么操作系统为文件分配的这16kb的数据会倾向于由4个连续的文件块构成。

这里还需要特别注意的是,比如文件块1,2,3,4 四个文件块 组成b+tree的根节点,那么b+tree的子节点一定是图中的文件块5,6,7,8组成的吗?

实际上也不是 ,因为随着b+tree节点的删除,分裂等操作,由1,2,3,4文件块组成的根节点 指向的子节点位置可能已经变成了其他连续的文件块组成的节点了,它们之间是逻辑上的相邻,在物理磁盘上并不相邻

举个例子:

为了简单起见,我还是假设数据库在实现的时候,将一个b+tree的节点大小和文件块大小设计为相等。
比如文件块1的节点的左孩子指向了文件块2的节点,如果文件块2的节点中的数据被全部删除了,那么文件块2整个空间就会被标记为删除状态。而文件块1的节点的左孩子指针将会指向其他的文件块,空出来的文件块2的空间则会被新的节点拿来存放数据。可以看到,父子节点之间,只是通过指针联系在了一起,而父子节点可能处于相隔很远的文件块上。

理解了b+tree节点和文件块和磁盘扇区三者关系后,我们再来实际看看b+tree的写入过程,同时便能理解为什么b+tree的写入性能不高了

b+tree的写入过程

真实数据库的b+tree一个节点能容纳上千个key,为了简单的演示下b+tree的写入过程,这里我会用一个最简单的b+tree来做演示。最简单的b+tree实际上是一颗2-3树。

它具有的特性是每个节点最多能容纳两个元素,孩子节点最多是3个。注意b+tree的插入都是往叶子节点插入。

2-3树插入过程.png

拿最后一个插入元素4举例,首先得从整颗b+tree中找到4应该插入的节点位置,读取节点内容后,发现 最后一个叶子节点如果加上元素4,将会破坏2-3树的性质,所以又会产生节点的分裂,其父节点的内容也会发生变化。

由于b+tree各个节点之间在物理磁盘上可能已经跨越了不同的磁道了, 所以无论从插入时必须 首先得找到节点这个过程来看,还是分裂时会改变父节点这个过程来看,这样的过程都可以认为是随机读写磁盘的行为,都可能跨越多个磁道。而跨越多个磁道的操作,是磁盘最耗时的操作,这样的插入性能当然不高。

后续我也会介绍另一种构建索引的数据结构LSM(日志结构合并树),有别与b+tree,它具有很好的写入性能。

与看了还不懂b+tree的本质就来打我相似的内容:

看了还不懂b+tree的本质就来打我

看了还不懂b+tree的本质就来打我 数据检索系列视频 大家好,我是蓝胖子。 今天我们来看看b+tree这种数据结构,我们知道数据库的索引就是由b+tree实现,那么这种结构究竟为什么适合磁盘呢,它又有哪些缺点呢? 我将不会对b+tree的一些定义做过多的讲解,因为这些东西网上一大推,关键还是要抓住

[转帖]Nginx 反向代理解决跨域问题

https://juejin.cn/post/6995374680114741279 编写代码两分钟,解决跨域两小时,我吐了。 如果对跨域还不了解的朋友,可以看这篇:【基础】HTTP、TCP/IP 协议的原理及应用 最近一段时间,在搞一个 SDK 的项目,使用的 TS + rollup。rollup

还在手动发早安吗?教你用java实现每日给女友微信发送早安

摘要:教你如何用java实现每日给女友微信发送早安等微信信息。 本文分享自华为云社区《java实现每日给女友微信发送早安等微信信息》,作者:穆雄雄 。 前言 据说这个功能最近在抖音上很火,我没有抖音,没有看到。 但是我在网上看了,相关案例确实很多,但是大家都是借助于了微信服务号,在我看来,效果很不佳

CAP 8.2 版本发布通告

前言 今天我们很高兴宣布 CAP 发布 8.2 版本正式版,我们在这个版本中主要致力于对订阅着并行执行的特性提供支持,同时添加了对在订阅者中对消息头的控制行为。 下面,具体看一下我们新版本的功能吧。 总览 可能有些人还不知道 CAP 是什么,老规矩来一个简介。 CAP 是一个用来解决微服务或者分布式

[转帖]是的你没看错,HTTP3来了

https://www.jianshu.com/p/288ce6a8ab88 简介 很多小伙伴可能还沉浸在HTTP1.1的世界无法自拔,但是时代的洪流已经带领我们来到了HTTP3的世界了。是的,你在桥上看风景,而桥边的房子上有人正在看你。 为了不被时代所抛弃,今天给大家讲解一下HTTP3的新特性。

这么简单的问题都不会,那还面试什么!?

最近群里的讨论太猛了,硝烟味很重,有的群友直接开怼:这么简单的问题都不会,那你还面试什么呀?我一看这不就是很简单的数组和切片的区别嘛。

youtube-dl下载太慢了,我选yt-dlp

前言 最近过年嘛,过年前照例来下载一些贺岁歌曲,现在国内没啥人做贺岁专辑,这方面还得看马来西亚华人,他们每年都有出专辑,质量很不错! 国内平台自然是没有(或者不全的),需要在YouTube下载~ 之前我都是用Chrome插件下载完再使用脚本合并视频,有点繁琐,今年试试自动下载的黑科技~ 作为对比的这

《流畅的Python》 读书笔记 第一章数据模型(1)230926

写在最前面的话 缘由 关于Python的资料市面上非常多,好的其实并不太多。 个人认为,基础的,下面的都还算可以 B站小甲鱼 黑马的视频 刘江的博客 廖雪峰的Python课程 进阶的更少,《流畅的Python》应该算一个。 加上,自己也很久没有耐心的看完一本书了 鉴于以上2点,2023-9-26开始

从头到尾说一次 Spring 事务管理(器)

事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一。​本文会从设计角度,一步步的剖析 Spring 事务管理的设计思路(都会设计事务管理器了,还能玩不转?)

瑞亚时间管理大师,我们使用到了哪些技术栈?

这篇文章,我会介绍开发瑞亚时间管理大师的过程中,所使用到的技术栈, 对独立开发感兴趣的同学,可以进行参考。 瑞亚时间管理大师, 是一个在线的任务管理、项目管理、 团队协作平台。瑞亚 拥有现代化的页面风格,高效、简便,同时适合个人和团队使用。 功能预览 瑞亚时间管理大师是以任务管理为核心,还包括了看板