第九章 索引和散列
△用于在文件中查找记录的属性或属性集成为搜索码。如果一个文件上有多个索引,那么他就有多个搜索码。
1.索引类型:
(1)顺序索引(基于值的顺序排序)
-1. 如果包含记录的文件按照某个搜索码指定的顺序排序,那么该搜索码对应的索引称为聚集索引(主索引)。其他的索引被称为非聚集索引(辅助索引)。在搜索码上有聚集索引的文件称作索引顺序文件。
-2.稠密索引和稀疏索引
索引项或索引记录由一个搜索码值和指向具有该搜索码值的一条或者多条记录的指针构成。只想记录的指针包括磁盘块的表示和表示磁盘块记录内的块内偏移量。
·稠密索引:每个搜索码值都有一个索引项。
·稀疏索引:只为搜索码的某些值建立索引项。(只有当关系按搜索码排列顺序存储是才能够使用稀疏索引,也即索引是聚集索引)
eg.
-3.多级索引:(具有两级或者两级以上的索引)
-4.索引的更新
△.插入
△删除
-5. 辅助索引:
辅助索引必须是稠密索引,对每个搜索码都有一个索引项。(聚集索引可以是稀疏索引,可以只存储部分搜索码的值)
eg.
*索引项指向存放指针的桶,桶内存放各条记录的地址。
*一个搜索码可以有多个属性,一个包含多个属性的搜索码称为符合搜索码,按照字典序进行排列。
(2)散列索引(基于将值平均分布到若干散列桶中。一个值所属的散列桶是有一个函数决定的,该函数被称为散列函数(hash function))
2.B+数索引文件
B+树索引采用平衡树结构
(1)B+树的结构:
-1. B+树索引是一种多级索引。它最多包含n-1个搜索码值K1,K2,……,Kn-1,以及n个指针P1,P2,……Pn。
指针Pn作用:Pn将叶节点按搜索码顺序串在一起
Pi指向的子树搜索码的值小于Ki大于等于K(i-1)
-2.叶节点的取值个数为:
非叶节点的指针个数为:
根节点和其他非叶节点不同,它包含的指针数可以小于ceil(n/2)。除非整棵树只有一个节点,否则根节点必须至少包含两个指针。
eg.
-3.
#1. B+树上的查询:
#2. B+树的插入和删除
详情见下链接:
(2)不唯一搜索码
假如一个关系可以用与多个包含同一搜索码值的记录,那么该搜索码称为不唯一搜索码。
3.B+树的扩展
(1)B+树文件组织
在B+树文件组织中,树的叶结点存储到是记录而不是指向记录的指针。
(2)为了解决文件组织可能在没更新的情况下改变文件记录的位置,辅助索引不存储指向被索引的记录的指针,而是存储主索引搜索码的属性值。
B树和B+树的区别:
(1)B+树内节点不存储数据,所有 data 存储在叶节点导致查询时间复杂度固定为 log n。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好为O(1)。
(2)B+树叶节点两两相连可大大增加区间访问性,可使用在范围查询等,而B树每个节点 key 和 data 在一起,则无法区间查找。
(3)B+树更适合外部存储。由于内节点无 data 域,每个节点能索引的范围更大更精确
4.多码访问
复合搜索码
覆盖索引存储一些属性值以及指向记录的指针。
5.静态散列:
(1)桶(表示存储一条或者多条记录的一个存储单位)。正规地说,K表示所有搜索码值的集合,令B表示所有桶地址的集合。散列函数h是一个从K到B的函数,h表示散列函数。
*分布式均匀的。即散列函数从所有可能的搜索码值集合中为每个桶分配同样数量的搜索码值。
*分布式随机的。散列值不应与搜索码的任何外部可见的排序相关,表现为随机的。
(2)桶溢出处理:
桶溢出可能有以下几个原因:
*桶不足
*偏斜
1.多条记录可能具有相同的搜索码
2.所选的散列函数可能会造成搜索码的分布不均
△使用溢出桶来处理溢出问题。当桶满之后,会通过链接链接到溢出桶,这种处理被称为溢出链。该散列结构被称为闭地址(闭散列)。
另一种方式被称为开地址:桶集合是固定的,没有溢出链。当一个桶满了之后,系统将记录插入到初始桶集合B的其他桶中。 线性探法(使用下一个有空间的桶)
开地址曾用于构造编译器和汇编器的符号表,闭地址更适合用于数据库地址。
(3)散列索引
散列索引将搜索码以及其相应的指针组织成散列文件结构。我们使用术语散列索引来表示散列文件结构,同时也用它表示辅助散列索引。
6.动态散列:(允许散列函数动态改变以适应数据库增大或缩小的需要)
确定值->散列函数 范围->顺序
7.位图索引:
位图就是位的一个简单数组。
为了识别被删除记录,我们可以存储一个存在位图。如果第i位为0,表示记录i不存在,否则为1.