前面的文章我们已经讨论了B树的基本结构和操作,现在我们来看看数据库系统中B树是怎样被存储到磁盘文件的。磁盘的访问和内存的访问方式是完全不同的,操作系统的虚拟内存机制使得应用程序可以透明的访问内存;而访问磁盘时需要借助系统调用并指定访问文件的位置,然后还要将文件的内容读取解析到内存中。
当在设计高效的磁盘数据结构时必须考虑到以上这一区别。下面我们将讨论如何设计易于创建、修改和解析的文件格式,讨论设计高效磁盘数据结构的通用原则和实践,这些原则不仅仅只适用于B树。
事实上有很多可行的方式可以实现B树的磁盘存储,这里我们讨论几个常用的实现方式。每个具体实现的细节可能略有不同,但一般原则是相同的。在真正实现B树磁盘存储时,仅仅理解B树的基本机制(比如节点拆分和合并)是不够的,许多其它因素也必须一并考虑才能达到最终目的。
在磁盘数据结构中,指针的含义和内存中的含义有很大的不同。事实上可以把磁盘B树看成是一种文件页面管理机制:它组织文件页面并能快速的定位页面,因此文件的页面和指针都必须正确的设置和保存到适当的位置。
页面结构
数据库系统在数据文件和索引文件中存储数据记录,这些文件被划分为大小固定的称为页的单元。页的大小是文件系统块的大小的倍数,通常在4到16Kb之间。
B树中节点分为两类,包含键和数据记录对的叶子节点,以及包含键和指向其它节点指针的非叶子节点。每一个节点由一个或多个页构成,所以B树中节点和页可以认为是等同的。
在最早关于B树的论文中描述了一种存储固定大小数据记录的简单页数据组织方式。如图3-4, 每一页包含多个由三个成员组成的结构:k存储键,v存储键关联的值,p指向子页面。