17

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

  1. 内存指针和磁盘地址之间的转换,见这篇文章
  2. 插入新的 k/v 项目时如何拆分页面?在内存中实现非常容易。

谢谢

4

2 回答 2

4

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

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

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

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

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

希望能帮助到你。

于 2011-02-28T18:55:12.620 回答
1

我的建议是看一下《数据库系统实现》这本书

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

第 4 章索引结构有一节介绍 Btrees

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

于 2011-01-14T11:59:47.970 回答