数据结构都是针对内存,如果数据的规模很大,或者需要长期保存,则必须以文件的形式存储在外存,一般程序都是以大型数据库为中心,而数据库一般都是最为文件存放在外存中。
数据结构的最终目的是提高数据处理速度,对数据库而言,主要处理是查找,包括精确匹配查找、范围查找、最大值最小值查找等;
索引是为了加快查找速度而设计的一种数据结构,索引技术是组织大型数据库以及磁盘文件的一种重要技术,
索引一般分为线性索引和树行索引。
一般将数据元素称之为记录;
文件,是指存储在外村上的记录集合。
从操作系统来看,文件是无结构的来纳许字节序列;
从数据库来看,文件是又结构的记录集合,每个记录由若干数据项组成,记录一个文件中进行存取的基本单位,数据库是文件中可使用的最小单位;
索引、索引项:
一般将某个字段设置为索引,索引是将关键码与他对应的记录相关联的过程,一个索引隶属于某一文件,它由若干索引项构成;
每一个索引项至少包含关键码、和关键码对应的记录在存储器中的位置等信息。
索引并不需要重新排列记录在文件中的顺序,一个文件可能由多个相关的索引,每个索引往往支持一个关键码,并且通过改索引实现对文件中记录的快速访问。
静态索引:是指在文件创建是生成索引结构,一旦生成就固定下来,只有当文件在组织是才发生变化;
动态索引:是指文件创建时生成的索引结构,在文件执行插入、删除等操作时,索引结构本身随之发生变化;
总之:
静态索引结构的优点是结构定型,建立方法简单,存取方便;
缺点是不利于更新,插入或删除时效率低。
动态索引结构的优点是在插入或删除时能够自动调整索引树结构,以保持最佳的搜索效率;
缺点是实现算法复杂。
线性索引、树行索引
索引项的集合可以组织成多种结构,一般有线性结构、树形结构;若索引项组织为线性结构,则称之为线性所索引或者索引标;
若索引项组织为树结构,则称之为树行索引;
多级索引
对一些大型文件,其索引本身可能也很大,在这种情况下,可对索引在建立一个索引,这样就构成了多级索引,当某级索引很大时,也可能要驻留在外存。
2.1稠密索引
稠密索引主要适用于静态索引。
线性索引中,若文件中的每个记录对应一个索引项,则这种索引称之为稠密索引;在稠密索引中,无论文件是否按关键码有序,索引项总是按照关键码有序排列.
只要内存空间允许,通常吧稠密索引存储在内存中,从而大大提高记录的查找速度;
示例:稠密索引的例子
索引表 文件
关键码 指针 关键码 其他数据项目
8 8对应的文件位置 8 。。。。。
9 9对应的文件位置 10 。。。。。
10 10对应的文件位置 9 .。。。。。
等等等
优点:
1.索引表是有序的,每一个索引项都包含一个关键码以及一个指针,因为可以实现对数据库的有效查找(采用折半查找)和随机访问(按照记录号访问)
注:查找技术稍后补充;
缺点:
1.稠密索引中,索引项的个数与文件的记录个数相同一比一,所以空间代价很大;如果记录过多,内存空间有限,就需要放在磁盘了,这样查找过程中可能多次访问磁盘,增加io性能;
2.一旦文件中删除、新增了记录,就必须更新稠密索引,因为稠密索引,关键码顺序存放,且顺序存储,时间\空间复杂度o(n),会移动索引项,代价有点高;
2.2 分块索引
分块索引既可以用于静态索引、也可以用于动态索引;
稠密索引中,索引项的个数与文件的记录个数相同一比一,所以空间代价很大;
为了减少索引项目的个数,可以对文件分快,使其分块有序。
所谓分块有序:是指文件划分为若干块,每一块内不要求有序(块内无序),但要求第二块中所有记录的关键吗均大于第一快中所有记录的关键码,依次类似,下一块比上一块关键码大。
对于分块有序的文件,每块只需对应一个索引项,这样,可以大大减少索引项的个数,这种索引方法叫分块索引。
在分块索引中,每块对应一个索引项,各索引项按关键码有序排序,形成一个索引表,结构如下:
块内最大关键码 快长 块首地址
索引表 文件
块内最大关键码 快长 块首地址 关键码 其他数据项目
35 3 块文件首地址 35 。。。。。
20 。。。。。
8 。。。。。
61 3 块文件首地址 52 。。。。。
40 。。。。。
61 。。。。。
88 3 块文件首地址 65 .。。。。。
88 .。。。。。
76 .。。。。。
分块索引的查找逻辑:
1.在索引表中确认对应块的首地址;
2.在块中查找对应的关键字;
在索引表查找是,由于索引表是被关键码有序的,所以可使用顺序查找,也可以用折半查找;
在块内进行查找,由于是无序的,因此,只能使用顺序查找;
在许多情况下,在对文件进行查找时,不仅需要对主关键码进行查找,还可能需要对次关键码进行查找,如果索引表中只有主关键码索引,则对这样的查找,还需建立一系列的次关键码索引。
多重表,是一种多索引结构,除了为文件建立一个主索引外,还为每个需要查找的次关键码建立一个索引,在文件中,为建立索引的次关键码分别增设一个指针域,用于将关键码相同的记录连接在一起(对稠密索引),或将在同一块中的记录的记录链接在一起(对分块索引);
是对次序关键码建立的索引表,在倒拍表中,索引项包括次关键码的值和具有该值的各记录的地址;
结构为:次关键码值 记录号表’
其中,记录号表存储具有相同次关键码值的所有记录的记录号,并且有序排列;
由于这种索引不是记录来确定属性(数据项)值,而是由属性值来确定记录的位置,因此称之为倒排表;
优点:
倒排表查找速度较快,有时不许读取记录,就可以得到解答,比如查找所有年龄在24-26的记录;
没有对文件进行修改,所以使用和维护都比较简单;
缺点:记录号不定长,处理起来不方便,此外,倒排表中具有同一次关键码的记录号是有序排列的,所以在插入和删除记录要做相应处理。