索引文件的结构(.idx)

请参阅

索引文件包含一个头记录以及一个或多个结点记录。头记录包含根结点、当前的文件大小、关键字长度、索引选项与签名以及用可打印的 ASCII 表示的关键字值和 FOR 表达式。头记录从文件位置 0 开始。

其余的结点记录包含属性值,现有的关键字数目以及指向当前结点的左结点和右结点(在同一层次上)的指针。另外还包含有一组字符,其中包括关键字值和指向某个低级结点或实际的表记录编号的指针。输出到文件中的每个记录的大小为 512 字节。

索引头记录

字节偏移 说明
00 – 03 指向根结点的指针
04 - 07 指向自由结点列表的指针(如果不存在则为 - 1)
08 - 11 指向文件尾的指针(文件大小)
12 - 13 关键字长度
14 索引选项(下列某一数值或它们的和):
1 – 唯一索引
8 – 索引包含 FOR 子句
15 索引签名(供将来使用)
16 - 235 关键字表达式(未编译;最多 220 个字符)1,3
236 - 455 FOR 表达式(未编译;以 null 值字节结束,最多220 个字符)
456 - 511 未使用

索引结点记录

字节偏移 说明
00 - 01 结点属性(下列某一数值或它们的和):
0 – 索引结点
1 – 根结点
2 – 叶结点
02 - 03 现有关键字的数目(0,1 或更多)
04 - 07 指向当前结点左结点的指针(在同一层次上;如果不存在,则为 - 1)
08 - 11 指向当前结点右结点的指针(在同一层次上;如果不存在,则为 - 1)
12 - 511 最多有 500 个字符,其中包括关键字长度的值,以及一个四字节的十六进制数表示(按照一般的自左而右的格式存储):
如果结点为叶结点(属性 = 02 或 03),这四个字节包含以十六进制格式表示的实际表记录编号;否则,这四个字节包含内联索引指针2。

字节 02 - 03,指定在这组字符中关键字/四字节十六进制数组合出现的次数。


1 关键字类型并不存储在索引中。必须由关键字表达式确定。
2 除了字符串、关键字值和叶结点中四字节数以外的所有数值均以保留码 (Intel 8086 格式) 表示。
3 使用数字作为关键字时要经过特殊处理。将使用下列算法转换数字,使得它们可以按照与字符相同的 ASCII 的排序序列进行排序。

排序树结构示例

在下面结构中查找关键字时,需要在根结点和叶结点之间的某个路径上搜索。在最低层上的结点是叶结点。因为关键字已进行了排序,因而子树中的所有关键字均小于或等于父结点的关键字。

上图中,使用字母作为关键字值。另外,每个关键字之后还有一个四字节的十六进制数。与叶结点中关键字相关联的数是实际的表编号—其他结点中的关键字都有与之关联的内联索引指针。

索引结点记录的 12—511 字节可分解如下:

在 12—511 字节中,关键字值/十六进制数组合共出现 n 次, n 为现有关键字的数目。