索引技术之有序索引

为什么要使用索引技术

当文件中记录的数据条数和数据量很大时,查找速度会明显下降,为了提高查找速度,我们必须对文件建立索引。

有序索引

根据记录中某种排序顺序建立的索引,叫做有序索引。一般索引技术是指这种索引。

有序索引的分类

如果索引的查找键值的顺序与主文件的顺序一致,那么这种索引称为主索引,也称为聚类索引。一般,主索引的查找键往往是文件的主键。
如果查找键的值的顺序与主文件的顺序不一致,那么这种索引称为辅助索引,或非聚集索引

在索引技术中,又有很多实现方法,用户可根据下面五个方面选择这些方法:
1、存取类型:用户是根据属性值查找记录,还是根据属性值的范围查找记录。
2、存取时间:查找记录所花费的时间。
3、插入时间:插入新记录所花费的时间,应包括两部份,找到正确的位置插入新记录所花时间和修改索引结构所花时间。
4、删除时间:它也包括两部分,找到被删记录删除所花时间和修改索引结构所花时间。
5、索引空间开销
在索引中,用于查找记录的属性集称为查找键。应注意,查找键不一定是主键(候选键、超键),前者的值允许重复,而后者的值不允许重复。

1、主索引
对于主索引,可以采用下面两种实现方法:
1、稠密索引和稀疏索引
稠密索引:对主文件中每一个查找键值建立一个索引记录(索引项),索引记录包括查找键值和指向具有该值的记录链表中第一个记录的指针,这种索引称为“稠密索引”。读者应注意,在有些教材中稠密索引定义为对主文件中每个记录建立一个索引记录,与我们的提法有区别。
稀疏索引:在主文件中,对若干个查找键值才建立一个索引记录,此时索引记录的内容仍和稠密索引一样,这种索引称为“稀疏索引
稠密索引
在稠密索引中,例如查找 LIU 记录,首先在索引中查找 LIU 的索引记录。如能找到,则沿着索引记录中的指针到达LIU的第一个记录,然后再沿着主文件的指针把具有该值的所有记录找到在这里插入图片描述
稀疏索引
在稀疏索引中,先要在索引中查找 LIU记录所在的范围,由于 LIU 在 HE 和LOU 之间,因此沿着HE索引记录中的指针到达主文件中的HE记录,然后沿主文件的指针链,把LIU记录找到(直到下一个索引记录指针指向的记录之前)。
在这里插入图片描述
相比之下,在带稠密索引的主文件中,查找速度较快;而带稀疏索引的文件中查找较慢,但稀疏索引的空间较小,因此插入、删除操作时指针的维护量相对要少系统设计者应在存取时间和空间开销方面权衡,选择何种索引。有一个折衷的办法,可把两种索引结合起来。首先为顺序文件的每一块建立一个索引记录,得到一个以块为基本单位的稠密索引,然后再在稠密索引基础上建立一个稀疏索引。查找时,先在稀疏索引中找到记录所在的范围,然后在稠密索引中确定记录在哪一块,最后在主文件的块中顺序查找,找到所在的主记录。这种方法实际已是二级索引了
2、多级索引
即使采用稀疏索引,可能建成的索引还是很大,以至于查询效率不高。例如,一个文件有 100000个记录,每块可存储10个记录,那么需要10000个数据块。若以块为基本单位建立索引,索引记录也有10000项。虽然索引记录要比数据记录小得多,假设每块可存储 100个索引记录,但是索引块仍需100 块。
如果索引较小,能在系统运行时常驻内存,查找速度还是较快的。如果索引很大,不能全部驻内存,只能以顺序文件形式存储在磁盘上。在需要时,把指定索引块调入内存。假设索引占据 n 个物理块,如果采用顺序查找,则最多要读 n 块。如果采用二分查找法,读的块数是log2n。例如上面提到的 100 个索引块,二分查找的次数是 7 次。设读 1 块的时间是 30ms,则读 7块的时间就要210ms,还是太花费时间。如果索引中使用溢出块技术,那么二分查找就不能用了。
解决这个问题的方法是对主索引再建立一级稀疏索引。即对每个索引块建立一个索引记录,如下图所示。为了查找记录,可以在外层索引使用二分法查找,找到一个索引记录,该索引记录的查找键值小于或等于给出查找键值的最大一个键值;然后沿着索引记录中的指针到达内层索引块;在内层索引块可用顺序查找或二分查找也可找到相应的索引记录;然后沿着这个索引记录中的指针到达主文件的某个数据块;在数据块中沿着指针链查找记录。
在这里插入图片描述
2、辅助索引
在主索引中,我们可以方便、快速地根据某个查找键值找记录。如果我们要根据另一个查找键值寻找主文件的记录,那么可以用辅助索引方法实现。在主索引中,具有相同查找键值的记录在同一块中或相邻的块中,因而查找速度较快。而在辅助索引中,具有相同查找键值的记录将分散在文件的各处,因而查找速度较慢,并且查找时无法利用主文件中按主索引键值建立的指针链。如果也像主索引一样,在主文件中为辅助索引键值的记录用指针链接起来,那么这种代价很大。
辅助索引可采用下面的方法实现:仍然为每个查找键值建立一个索引记录,内容包括查找键值和一个指针,但这个指针不指向主文件中的记录,而是指向一个桶,桶内存放指向具有同一查找键值的主记录的指针。例如在图1所示的顺序文件中,可以对属性 SALARY建立一个辅助索引,其结构如图2所示。在主索引中可以采取顺序查找方法。在辅助索引中,由于同一个查找键值的记录分散在文件的各处,因此以辅助索引查找键顺序扫描文件是行不通的,每读一个记录几乎都要执行读一块到内存的操作。

图一图一

在这里插入图片描述
图二

辅助索引都是稠密索引,不可能是稀疏索引结构。在主记录插入或删除时,都要修改辅助索引,修改的方法与主索引的方法类似。

猜你喜欢

转载自blog.csdn.net/qq_40744606/article/details/88086324