从映射观点看索引

 信息检索主要有“检”与“索(办手续)”两个动作。在图书馆借书时,一般而言,

找书的时间比办理手续的时间长得多,因而缩短检查时间是提高效率的关键。数据库中检

索信息也与此类似。

在没有索引文件时,DBMS处理用户查询的主要操作是:

(1) 通过线性搜索匹配,确定待查信息的位置,进行定位(例如用C语言的fseek)。

(2) 定位记录作为数据库当前记录且装入工作区,作后续处理(如显示,计算等等)。

由于采用了数据文件高速缓存,CerBase 中File_IO 模块的LoadCurrRec(WA_N)函数能

高效地执行第二步。例如,在386/DX40 微机上,用 Turbo Profiler 测得所花平均时间

为T1=1 微秒左右。而作第一步时,平均读盘次数 A = 被搜索文件大小/ (缓存器大小

× 2)。设每次读盘时间为 T2 ,(远大于T1)则总耗时T=T1+ T2×A,显然,如果能减少

搜索时的读盘次数A ,就能大大提高检索效率。

因为A 正比于被搜索文件大小,一个十分自然的解决办法是建立一个相对较小的, 从

关键字到记录位置的对查表,即下列三元组的集合: (关键字,记录地址,附加信息), 于

是,可以花较少读盘时间来查表,然后按照记录地址一次就读入记录。上述三元组称为

索引项。其中,附加信息可以为空。保存索引项集合的文件称为索引文件。由于索引文件

较主文件小,一般可大大减少定位时所需双平均读盘次数。显然,查表又可视为如下的索

引映射IndexMap : 关键字集合 —> 记录地址集合。

常用的索引映射有下列几种:

1. 散列函数(Hash)

现实生活中广泛地使用着散列函数。

例5.1 以年龄为关键字,定义Hash(Age) = Age Mod 12,把人按年龄分成12个组,即

通常的12属相“鼠、牛、虎、兔,...”。 在同一属相中再线性搜索,寻址效率提高

12倍。

例5.2 影剧场分单双号进门,相当于Hash(N )= N Mod 2,使观众入座速度提高一倍。

例5.3 在英文字典每个字母开始处贴一标签,相当于定 Hash(WordStr)= WordStr[1],

提高了查字典的效率。

2. 无序索引

索引映射 IndexMap:{关键字} --> { 记录号 } ,而索引文件不排序。平均搜索次

数为关键字总数/2 ,由于索引文件比主文件小(通常小一个数量级, 可以全部或大部分

读入内存,在内存中搜索定位,从而提高了速度。可以比喻为"小无序管大有序"。

例 5.4 一本书的目录可看成是无序索引映射 IndexMap : 章节名称集合 —> 页码集合。

由于目录相对较小,易于一目十行地浏览,加快了检索内容的速度。

3. 顺序索引(Sequential Index)

在无序索引的基础上作如下改进:将索引文件排序后保存,因而在索引文件中搜索关

键字可以用二分法,计算复杂度为 Log(N ),当N >30 时,就有显著效益。顺序索引

又分为两类,即"小有序管大有序" 和"小有序管大无序"。

4.稀索引

是"小有序管大有序"的改进型。既然索引文件和主文件都是排序的。那么,隔 N抽

一而建立起来的索引集合就缩小到原来的 1/N,其定位误差小于N ,然后在N 个项中线性

搜索。

例5.5 英汉字典中的眉索引,再每页顶上列出当页的始词和尾词,组成了高效的,节省空

间的稀索引。

5.多级索引

有时,在处理数据文件时建立了索引文件,由于的规模仍然太大,为进一步提高速度,

又建立了索引的索引,以及索引的索引的索引。

例5.6 在1971年版的新华字典中查“飞”字,利用了“ 部首检字”和“检字表”两级

索引,因而能在正文中迅速查出释义,如图5.1所示。

(建议用Edit HTML方式阅读图表)

 ┏━━━━┓  ┏━━━━┓           ┏━━━━━┓
┃ 一划 ┃ ┃ ┃ ┃ fei┃--稀索引(书眉)
┃ 乙 15 ┃ ┃ 飞:111┃—密索引 ┃ ┃
┃ ┃ ┃ ┃ ┃飞:鸟在 ┃
┃ ┃ ┃ ┃ ┃空中的运动┃
┗━━━━┛ ┗━━━━┛ ┗━━━━━┛


部首检字 --> 检字表第15页 ---> 正文111页


图5.1 多级索引,稀索引和密索引

6.结构化索引


设在处理数据文件A.DBF 时建立了索引文件B.NDX,由于 B.NDX 的规模仍然太大,为


进一步提高速度,又建立了索引的索引 C.NDX,以及索引的索引的索引 D.NDX。但这又引


入了新问题:B、 C、 D 三个索引文件的对象层次不同,结构不同,操作三个索引文件比


较繁琐。 能否用一个结构来实现多重索引的思想呢? 为此,人们研究了各种各样的结构


化索引。例如二叉树索引、B—树,等等。其中最成功的是 B树及其变种B+树。


由于B 树的特色和优异性能,目前的每一个成功的DBMS都采用了B 树,每一本关于数


据结构的教科书都讨论B树。掌握B 树的结构及其算法是DBMS开发者不可回避的任务。


你可能感兴趣的:(database)