如何理解数据库的B+树

技术如何理解数据库的B+树本篇内容介绍了“如何理解数据库的B+树”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 数据从

本文介绍了“如何理解数据库的B树”的知识。很多人在实际案例的操作中会遇到这样的困难。让边肖带领你学习如何处理这些情况。希望大家认真阅读,学点东西!

1 数据从磁盘读写与内存读写有哪些不同

我们通常会接触到机械硬盘和固态硬盘。存储器是一种半导体器件。对于内存,当我们知道内存地址时,就可以通过地址获取数据,这是内存的随机存取特性。访问速度快但成本高,所以内存空间一般很小。

对于磁盘,它们是机械设备。每当磁盘访问数据时,都需要等待磁盘旋转到磁头,才能读取相应的数据。即使磁盘转得很快,与内存的随机存取相比,仍然是渣。可以看出,如果是随机读写,其性能差距非常大。如果是按顺序访问大量数据的时候,磁盘和内存的性能差距其实很小。为什么呢?

磁盘的最小读/写单位是扇区。现在磁盘扇区一般是4k字节。对于操作系统,一次将读取多个扇区。到目前为止,操作系统的最小读取单位是块。每当我们从磁盘读取一段数据时,操作系统会一次读取整个数据块,所以对于大量的顺序读写,磁盘效率会比随机读写高很多。

现在,假设您有一个有序数组,所有数组都存储在磁盘上的块中。现在,我们找到了二分搜索法的元素A。首先,我们找到中间元素,把它从块中取出,从磁盘放入内存,然后在内存中做二分搜索法。在下一步中,如果搜索到的元素在其他块中,我们需要继续从磁盘读取内存。反复从磁盘到内存,效率会很低。因此,我们需要找到一种方法,使磁盘的访问次数尽可能低。

2 数据和索引分离

我们以公安系统为例。系统中用户众多,每个用户除了姓名、年龄等基本信息外,还有唯一的ID。当我们得到这个ID,就可以知道相应的基本信息。但是,每个用户的基本信息太多,无法存储在内存中,所以应该存储在磁盘中。

如何理解数据库的B+树

用户数据

采用有序数组,其中用户ID和用户信息所在磁盘的位置分别存储,这样我只需要存储两个元素,直接存储在内存中。如下图所示

如何理解数据库的B+树

有序数组

然而,在数据频繁变化的场景下,有序数组的弊端就显现出来了。在大多数情况下,我们仍然考虑使用二叉查找树或哈希表。但是,哈希表不支持区间查询,因此更经常使用二分搜索法树。如下图所示

如何理解数据库的B+树

在此插入图片描述。

如果索引太多,不能完全存储在内存中,可以考虑将索引存储在磁盘中吗?如何高效地组织磁盘中的索引结构?这就引入了B树。

2 B+树

使节点大小等于块大小。

我们知道,当操作系统访问磁盘时,它通常以块的形式读取磁盘。如果你目前只需要读取几个字节的数据,但磁盘还是会读出整个块,读写会不会效率低?在B-tree中,大榭使节点的大小等于块的大小,并在节点中存储有序数组而不是元素,从而充分利用操作系统的例程,最大化读取效率。

内部节点和叶节点。

虽然内部节点和叶节点具有相同的结构,但是它们存储的内容不同。内部节点存储键和维护树结构的指针,但不存储与键对应的数据。叶节点存储密钥和相应的数据,但不存储指针来维护树结构,这最大化了节点空间的利用率。

如何理解数据库的B+树

内部节点和叶节点。

b树采用双向链表,具有良好的范围查询能力和灵活的调整能力。

综上所述,B树是一个完全平衡的M阶多分支树。

如何理解数据库的B+树

m阶多树

3 B+树的检索方案

刚吹了一波B树。有多牛逼?怎么找回的?具体的搜索过程如下:首先,我们确认要搜索的查询值位于数组中的哪两个相邻元素之间,然后我们比较第一个元素的对应值。

指针读出,获得下一个  block 的位置。读出下一个 block 的节点数据后,我们再对它进行同样处理。这样,B+  树会逐层访问内部节点,直到读出叶子节点。对于叶子节点中的数组,直接使用二分查找算法,我们就可以判断查找的元素是否存在。如果存在,我们就可以得到该查询值对应的存储数据。如果这个数据是详细信息的位置指针,那我们还需要再访问磁盘一次,将详细信息读出

B+树是一个m阶的多叉树,所以B+树中的一个节点可以存放m个元素的数组,ok,这样的话,只需要几层的b+树就可以索引数据量很大的数了。比如1个2k的节点可以存放200个元素,那么一个4层的B+树就能存放200^4,即16亿个元素。

如果只有四层,意味着我们最多访问磁盘4次,假设目前每个节点为2k,那么第一层就一个节点也就2k,第二层节点最多200个元素,一共就是0.8M。第三层200^2,也就是40000个节点,一共80M。对于当前的计算机而言,我们完全可以将前面三层存放于内存中,只需要将第四层存放于磁盘中,这样我们只需要和磁盘打一次交道就分手,也就是面试想知道的为什么要分为内部节点与叶子节点。

4 B+树如何进行动态的调整

上面介绍了B+树的结构和查询原理,现在我们看看B+树增加和删除是怎么个情况

现在我们以三个元素的B+树 为例,假设目前我们要插入ID为6=5的元素,第一步先查找对应的叶子节点,如果叶子节点没有满,直接插入即可

如何理解数据库的B+树

插入元素6

如果我们插入的元素是10?按道理我们应该插入到9后面,但是节点已经满了,所以我们需要采取其他的方式。方法是将此叶子节点进行分裂,即生成一个新的节点,然后将数据在两个节点中平分。

如何理解数据库的B+树

节点分裂

很明显,叶子节点的分裂影响到了父节点,如果父节点也是满的,也要进行分裂

如何理解数据库的B+树

节点分裂

“如何理解数据库的B+树”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/42405.html

(0)

相关推荐

  • 复杂的英语,高中英语复杂句子成分分析例句

    技术复杂的英语,高中英语复杂句子成分分析例句并列句中两个分句又内含从句的话,那就成为一种更加复杂的并列复合句复杂的英语。例句:While the men worked to stregthen the dam ,the

    生活 2021年10月20日
  • sqlite3基本操作(sqlite3怎么创建数据表)

    技术SQLite3如何实现数据库全文搜索这篇文章主要为大家展示了“SQLite3如何实现数据库全文搜索”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQLite3如何实现数据

    攻略 2021年12月18日
  • 如何理解Linux系统后门

    技术如何理解Linux系统后门这篇文章主要介绍“如何理解Linux系统后门”,在日常操作中,相信很多人在如何理解Linux系统后门问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Li

    攻略 2021年10月20日
  • currentTimeMillis和getTimeInMillis与getTime获取当前时间戳耗时比较是怎样的

    技术currentTimeMillis和getTimeInMillis与getTime获取当前时间戳耗时比较是怎样的这期内容当中小编将会给大家带来有关currentTimeMillis和getTimeInMillis与g

    攻略 2021年10月20日
  • 如何远程部署应用到Tomcat

    技术如何远程部署应用到Tomcat如何远程部署应用到Tomcat,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前几天有人在群里提了个问题:怎么样通过程序

    2021年11月18日
  • Sql Server参数化查询之where in和like实现详解

    技术Sql Server参数化查询之where in和like实现详解 Sql Server参数化查询之where in和like实现详解GPS平台、网站建设、软件开发、系统运维,找森大网络科技!htt

    礼包 2021年11月15日