从映射观点看索引

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

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

索信息也与此类似。

在没有索引文件时,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开发者不可回避的任务。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK源码解析之 Java.lang.Boolean

Boolean 类是将 boolean 基本类型进行包装。类型为 Boolean 的对象包含一个单一属性 value,其类型为 boolean。 此外还提供了许多将 boolean 转换为 String、String 转换为 boolean,以及其他一些方法。 一、类定义 public final class Boolean implemen…

MYSQL的集群的安装与配置(mysql-5.1.21)

具体安装与配置:1)准备工作:6台机器,IP地址分别为192.168.0.(231-236)MGM节点:192.168.0.231(232)SQL 节点:192.168.0.233-234NDBD 节点:192.168.0.235-236系统都是REDHA…

JDK源码解析之 Java.lang.Byte

byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数,以二进制补码表示的整数 取值范围:默认值为0,最小值为-128(-27);最大值是127(27-1) Byt…

在命令行模式下管理SELinux

作者: Oslad.com (原创!转载请注明出处) 2006-07-14 在 GUI 图形界面模式下,要更改 SELinux 的策略使用方式,只需依次点击“应用程序”,“系统设置”,“安全级别”;然后在“安全级别配置”对…

JDK源码解析之 Java.lang.Double

Double类是原始类型double的包装类,它包含若干有效处理double值的方法,如将其转换为字符串表示形式,反之亦然。Double类的对象可以包含一个double值。 Double类包装原始类型的值 double中的对象。类型的对象 Double包含一个类型为的字段 doub…

网页搜索帮助-禁止搜索引擎收录的方法

什么是robots.txt文件?搜索引擎使用spider程序自动访问互联网上的网页并获取网页信息。spider在访问一个网站时,会首先会检查该网站的根域下是否有一个叫做robots.txt的纯文本文件。您可以在您的网站中创建一个纯文本文件robots.txt,在文件中声明该网站…

JDK源码解析之 Java.lang.Float

Float类是原始类型float的包装类&#xff0c;它包含若干有效处理浮点值的方法&#xff0c;如将其转换为字符串表示形式&#xff0c;反之亦然。Float类的一个对象可以包含一个浮点值 一、类定义 public final class Float extends Number implements Comparable<Float> {…

FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)

在主动模式下&#xff0c;FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接&#xff0c;然后开放N1号端口进行监听&#xff0c;并向服务器发出PORT N 1命令。服务器接收到命令后&#xff0c;会用其本地的FTP数据端口&#xff08;通常是20&#xff09;来连接客户…

JDK源码解析之 java.lang.Integer

teger 基本数据类型int 的包装类 Integer 类型的对象包含一个 int 类型的字段 一、类定义 public final class Integer extends Number implements Comparable<Integer>{}类被声明为final的,表示不能被继承;继承了Number抽象类,可以用于数字类型的一系列转换;实现了Comp…

Loadrunner的基本概念

1)vuser_init(only one &#xff0c;重复执行脚本的时候&#xff0c;此部分只会执行一次 ) %G< rJc*P 2)action( 一个或者多个 , 重复执行脚本的时候&#xff0c;只有该部分会按重复的次数重复执行 ) z*Xfjy(Mj 3)vuser_end(only one, 重复执行脚本的时候&#xff0c;此…

JDK源码解析之 java.lang.Long

Long 与Integer 是数值类型中使用频率最高的两个,也是提供支持方法最多的两个 他们提供出来的方法功能也是高度的相似 一、类定义 public final class Long extends Number implements Comparable<Long> {}类被声明为final的,表示不能被继承;继承了Number抽象类,可以用于…

sed教程入门与实例练习(一)

UNIX 世界中有很多文本编辑器可供我们选择。思考一下 — vi、emacs 和 jed 以及很多其它工具都会浮现在脑海中。我们都有自己已逐渐了解并且喜爱的编辑器&#xff08;以及我们喜爱的组合键&#xff09;。有了可信赖的编辑器&#xff0c;我们可以轻松处理任何数量与 UNIX 有关的…

JDK源码解析之 Java.lang.Short

Short类是基本类型short 的包装类&#xff0c;它包含几种有效处理短值的方法&#xff0c;如将其转换为字符串表示形式&#xff0c;反之亦然。Short类的对象可以包含单个短值。 一、类定义 public final class Short extends Number implements Comparable<Short> {}类被…

sed教程入门与实例练习(二)

让我们看一下 sed 最有用的命令之一&#xff0c;替换命令。使用该命令&#xff0c;可以将特定字符串或匹配的规则表达式用另一个字符串替换。下面是该命令最基本用法的示例&#xff1a; $ sed -e ’s/foo/bar/’ myfile.txt上面的命令将 myfile.txt 中每行第一次出现的 ‘foo’…

Oracle GoldenGate简介

一、什么是Oracle GoldenGate&#xff1f; Oracle GoldenGate是用于实时数据集成和复制的综合软件包。它支持高可用性解决方案&#xff0c;实时数据集成&#xff0c;事务性更改数据捕获&#xff0c;数据复制&#xff0c;转换以及运营和分析企业系统之间的验证。 使用Oracle G…

sed教程入门与实例练习(三)

在第二篇 sed 文章中&#xff0c;我提供了一些示例来演示 sed 的工作原理&#xff0c;但是它们当中很少有示例能实际做特别有用的事。在这篇 sed 系列的最后文章中&#xff0c;我要改变那种方式&#xff0c;并使用 sed 来做实际的事。我将为您显示几个示例&#xff0c;它们不仅…

Oracle GoldenGate微服务架构

Oracle GoldenGate支持两种架构&#xff0c;经典架构和微服务架构&#xff08;MA&#xff09;。 可以出于以下目的配置Oracle GoldenGate&#xff1a; 从一个数据库中静态提取数据记录&#xff0c;并将这些记录加载到另一个数据库中。连续提取和复制事务性数据处理语言&#…

Oracle GoldenGate经典架构

可以使用Oracle GoldenGate Classic Architecture从命令行配置和管理数据复制。 图示的说明logicalarch2.png 注意&#xff1a; 这是基本配置。根据业务需求和用例&#xff0c;可以配置此模型的不同变体。 1、Manager Manager是Oracle GoldenGate的控制过程。必须先在Oracl…

WordPress 首页显示摘要

这里的方法不需要你另外装插件。 1、使用more标签 (缺点&#xff1a;每次都要加一下这个东西&#xff0c;不灵活只能一刀切。优点&#xff1a;方法比较正规不需要改动模版) 在你需要截断的地方(就是你的编辑框)加 <!–more–> 代码. 2、使用the_excerpt标签 (缺点&#x…

Oracle GoldenGate复制过程

这两种Oracle GoldenGate体系结构共有许多数据复制过程。 1、什么是Extract&#xff1f; Extract是一个过程&#xff0c;该过程被配置为针对源数据库运行或被配置为在下游挖掘数据库&#xff08;仅Oracle&#xff09;上运行&#xff0c;以捕获在其他位置的真实源数据库中生成…