我知道 B-Tree 如何在内存中工作,它很容易实现。但是,目前完全超出了我的范围,是如何找到在磁盘上有效工作的数据布局,例如:
- B-Tree 中的条目数可以无限增长(或至少超过 1000GB)
- 磁盘级复制操作被最小化
- 这些值可以有任意大小(即没有固定模式)
如果有人可以提供有关在磁盘级别布局 B-Tree 结构的见解,我将不胜感激。尤其是最后一个要点让我很头疼。我也很欣赏书籍的指针,但我见过的大多数数据库文献只解释了高级结构(即“这就是你在内存中的做法”),但跳过了磁盘布局的细节。
我知道 B-Tree 如何在内存中工作,它很容易实现。但是,目前完全超出了我的范围,是如何找到在磁盘上有效工作的数据布局,例如:
如果有人可以提供有关在磁盘级别布局 B-Tree 结构的见解,我将不胜感激。尤其是最后一个要点让我很头疼。我也很欣赏书籍的指针,但我见过的大多数数据库文献只解释了高级结构(即“这就是你在内存中的做法”),但跳过了磁盘布局的细节。
更新(oracle 索引内部的存档版本):http ://web.archive.org/web/20161221112438/http://www.toadworld.com/platforms/oracle/w/wiki/11001.oracle-b-tree-从概念到内部的索引
旧(原始链接不再存在):有关 oracle 索引内部的一些信息: http ://www.toadworld.com/platforms/oracle/w/wiki/11001.oracle-b-tree-index-from-the-概念到内部
笔记:
数据库不直接实现基于 B-tree 的索引,而是基于称为 B+ 树的变体。根据维基百科:
B+树可以看作是一个B树,其中每个节点只包含键(不是键值对),并且在底部添加了一个额外的级别,带有链接的叶子。
一般来说,数据库使用面向块的存储,b+ 树比 b-tree 更适合于此。
这些块是固定大小的,并留有一些可用空间以适应未来值或密钥大小的变化。
块可以是叶子(保存实际数据)或分支(保存指向叶子节点的指针)
一个如何实现写入磁盘的玩具模型(用于算术简化的块大小为 10k):
当从大索引中读取信息时:可以如下:
一个非常大的索引可以在多个文件上拆分,那么块的地址将是 (filename_id, address_relative_to_this_file)