btree如何存储在磁盘上?

Posted

技术标签:

【中文标题】btree如何存储在磁盘上?【英文标题】:How btree is stored on disc? 【发布时间】:2011-06-08 23:54:22 【问题描述】:

我知道如何在内存中实现 btree,但不清楚如何将 btree 存储在磁盘中。我认为有两个主要区别:

    内存指针和磁盘地址之间的转换,见post。 插入新的 k/v 项目时如何拆分页面?在内存中很容易实现。

谢谢

【问题讨论】:

可能重复***.com/questions/872070/…,即使那里的答案不是很好。 你有没有想过这个问题?这里有一个很好的开源实现:github.com/jankotek/JDBM3,但通读它需要时间。首先,您可以查看:github.com/jankotek/JDBM3/blob/master/src/test/java/org/apache/…。如果您发现了更好的资源,也请分享。 【参考方案1】:

我的建议是看书Database System Implementation"

第 2 章“数据存储”和第 3 章“表示数据元素”将为您提供有关此问题的一些提示。

第 4 章索引结构有一个关于 Btrees 的部分

这是迄今为止我找到的关于该主题的最佳信息来源。

【讨论】:

关于这个主题的书籍很多,例如,*数据库系统概念*(codex.cs.yale.edu/avi/db-book) 第 11 章。但是它们都没有谈到现实实现。【参考方案2】:

这完全取决于您使用的 DBMS。如果您想知道它是如何在 MS SQL Server 中实现的,请阅读以下内容:

页面(我猜它们几乎存在于所有现代 DBMS 中)——在 SQL Server 中它们是 8Kb。数据库文件由页面组成。 范围 - 8 个连续页面的逻辑组 (S)GAM - (共享)全球分配图。包含有关空闲和占用范围信息的位图。这是数据库文件的第一页之一。 IAM - 索引分配图。您可以找出哪些索引/堆存储在哪些范围中。有了这些信息,您就可以在存储索引/堆的文件中找到位置。

使用 IAM 和 GAM(或 SGAM),您可以拆分页面 - 只需将页面的一部分(应该溢出)移动到文件中的另一个页面。

IAM 和 GAM 也是您第一个问题的答案。

这些名称大部分取自 MS SQL Server,但我很确定,在其他 DBMS 中它的解决方法非常相似。

希望对你有帮助。

【讨论】:

以上是关于btree如何存储在磁盘上?的主要内容,如果未能解决你的问题,请参考以下文章

Android 包裹,存储在内存中还是磁盘上?如何存储在磁盘上

如何将字节数组作为图像文件存储在磁盘上?

如何在磁盘上存储 JSON 数据?

MySql数据是如何存储在磁盘上存储的?

MySQL:26 每一行的实际数据在磁盘上是如何存储的?

操作系统存储在磁盘上的位置以及引导加载程序如何定位?