如何在磁盘上布局 B-Tree 数据?

Posted

技术标签:

【中文标题】如何在磁盘上布局 B-Tree 数据?【英文标题】:How to lay out B-Tree data on disk? 【发布时间】:2017-04-06 01:30:43 【问题描述】:

我知道 B-Tree 如何在内存中工作,它很容易实现。然而,目前我完全不知道如何找到在磁盘上有效工作的数据布局,例如:

B 树中的条目数可以无限增长(或至少增加到 > 1000GB) 磁盘级复制操作已最小化 值可以有任意大小(即没有固定架构)

如果有人能提供有关在磁盘级别布局 B 树结构的见解,我将不胜感激。尤其是最后一个要点让我很头疼。我也很欣赏书籍的指针,但我见过的大多数数据库文献只解释了高级结构(即“这就是你在内存中的做法”),但跳过了磁盘布局的细节。

【问题讨论】:

你知道它是如何存储的吗?,你能分享你的学习吗? 遗憾的是没有。我仍然没有明确的答案。 【参考方案1】:

更新(oracle 索引内部的存档版本):http://web.archive.org/web/20161221112438/http://www.toadworld.com/platforms/oracle/w/wiki/11001.oracle-b-tree-index-from-the-concept-to-internals


OLD(原来的链接不存在了): 关于 oracle 索引内部的一些信息:http://www.toadworld.com/platforms/oracle/w/wiki/11001.oracle-b-tree-index-from-the-concept-to-internals

注意事项:

数据库不直接基于 B-tree 实现索引,而是基于称为 B+ 树的变体。根据***:

B+ 树可以看成是 B 树,其中每个节点只包含键(不是键值对),并且在底部添加了一个额外的级别,带有链接的叶子。

一般来说,数据库使用面向块的存储,b+ 树比 b-tree 更适合。

这些块是固定大小的,并留有一些可用空间以适应未来值或键大小的变化。

块可以是叶子(保存实际数据)或分支(保存指向叶子节点的指针)

如何实现写入磁盘的玩具模型(用于简化算术的块大小为 10k):

    在磁盘上创建一个 10G 的文件(它有 1000 个块) 第一个块分配为根,下一个空闲块分配为叶子,叶子地址列表放入根中 新数据插入,当前叶节点填充值直到达到阈值 数据继续插入,下一个空闲的被分配为叶子块,叶子节点列表被更新
      在多次插入之后,当前根节点需要子节点,因此下一个空闲块被分配为分支节点,它从根节点复制列表,现在根节点将只维护一个中间节点列表。 如果需要拆分节点块,则分配下一个空闲块作为分支节点,添加到根列表中,并在初始分支节点和新分支节点之间拆分叶子节点列表

当从大索引中读取信息时:可以去如下:

    读取第一个/根块 (seek(0), read(10k)),它指向位于块 900 中的子节点 读取块 900 (seek(900*10k), read(10K)) 指向位于块 5000 中的子节点 读取块 5000 (seek(5000*10k), read(10K)) 指向位于块 190 中的叶节点 读取块 190 (seek(190*10k), read(10K)) 并从中提取感兴趣的值

一个非常大的索引可以拆分为多个文件,那么块的地址将是 (filename_id, address_relative_to_this_file)

【讨论】:

感谢指向 B+ 树的指针。这是我实际上打算做的,但基本原则应该非常相似。我知道块的概念,它基本上只是一个用于一起读取/写入的 N 位数据的容器,其中 N 通常是硬件磁盘读取块的大小,以最大限度地减少磁盘访问。我的问题正是关于这个“容纳未来变化的一些可用空间”。在实践中是如何做到的? 阅读文章,有很多内部相关的信息 @valentin 该链接不再有效。如果仍然可用,请您再次找到该文章并重新链接它吗?是这个吗? blog.toadworld.com/2017/05/08/how-oracle-b-tree-indexes-work 有趣!所以我们可以插入、查找和更新(通过链接列表),但是如何删除记录呢?【参考方案2】:

阅读 这肯定会有所帮助 http://www.geeksforgeeks.org/b-tree-set-1-introduction-2/

【讨论】:

链接的教程很好,但它涵盖了我已经知道的内容:如何在内存中进行操作。我要问的是,如何在磁盘级别执行此操作,即如何计算所需的节点偏移量、指针等。我问的是“序列化”或“线性化”结构。

以上是关于如何在磁盘上布局 B-Tree 数据?的主要内容,如果未能解决你的问题,请参考以下文章

查询以显示 mysql 数据库中 B-Tree 索引的限制

如何在 google bigtable 中创建 b-tree 索引

B-Tree 学习

Mysql 索引实现原理. 聚集索引, 非聚集索引

B-Tree 和 B+Tree

Linq b-tree(b +,b *无论如何)有关DB的操作数集合?