文章目录
顺序索引
1、索引能提高检索的效率;
数据库系统中的索引与图书馆中书籍的索引所起的作用一样;索引中保存了相应记录所在的磁盘块的信息,这样可以直接将该磁盘页一次性加载到内存中。
磁盘中数据库文件的存储结构,也跟图书馆相似,按内容的类型,分区域存储,然后再细分到不同的书架,不同的组中。
2、两种基本的索引类型:顺序索引,散列索引
- 顺序索引:基于值的顺序排序;
- 散列索引:将值平均分不到若干散列桶中;
3、没有哪一种技术是最好的,只能说某种技术对特定的数据库应用最合适;
- 访问类型:
- 访问时间:
- 插入时间:
- 删除时间:
- 空间开销:
4、通常需要在一个文件上建立多个索引
例如,可能按作者、主题或者书名来查找一本书;
5、用于在文件中查找记录的属性或属性集称为搜索码:search key
6、顺序索引
顺序索引按顺序存储搜索码的值,并将每个搜索码与包含该搜索码的记录关联起来。
比如,图书馆中索引信息,可以精确到第几层楼的,第几号区域的,第几号书架的,第几格的,第几本书;也可以只精确到书架,反正书架上的书也不多,一眼瞥过去就能看到。
7、聚集索引
如果包含记录的文件按照某个索引码指定的顺序排序(物理存储的顺序),那么该搜索码对应的索引称为聚集索引。
在搜索码上又聚集索引的文件称为索引顺序文件,是数据库系统中最早采用的索引模式之一,是针对既需要顺序处理整个文件又需要随机访问单独记录的应用而设计的。
按聚集索引顺序对文件进行顺序扫描是非常有效的,因为文件中记录的物理存储顺序和索引顺序一致。
8、稠密索引和稀疏索引
稠密索引通常可以比稀疏索引更快地定位一条记录,但是所占空间较大,并且插入和删除时所需的维护开销也较大;
稠密索引:
稀疏索引:只有索引时聚集索引时才能使用稀疏索引。辅助索引必须是稠密索引。
9、多级索引
如果索引小到可以放在主存中,搜索一个索引项的时间就会很短;但是,如果索引过大而不能放在主存中,那么当需要时,就必须从磁盘中去索引块。
使用二分法搜索来定位索引项,需要读取 个磁盘块(b 为索引占用的磁盘总块数)。对于占用 10,000 个块的索引,二分法搜索需要 14 次读块操作,读一个块平均需要 10 ms,整个搜索需要 140 ms,一秒钟内只能进行 7 次索引搜索,这显然是很低效的。
索引项总是有序的,可以在索引项上建立二级的稀疏索引。具有两级或两级以上的索引称为多级索引,利用多级索引搜索记录与用二分法搜索记录相比需要的 I/O 操作要少的多。
10、索引的更新
每当文件中有记录插入或删除时,索引都需要更新;此外,记录更新时,任何搜索码属性受影响的索引也必须更新。
11、辅助索引
辅助索引,就是非聚集索引,也就是其对应的搜索码的顺序与文件中记录的物理顺序不同的索引。
辅助索引必须是稠密的。
辅助索引能够提高使用聚集索引搜索码意外的码的查询性能,但是,辅助索引显著增加了数据库更新的开销,数据库设计者根据对查询和更新相对频率的估计来决定哪些辅助索引时需要的。
12、多码索引,就是搜索码有多个属性的索引,
B+ 树索引文件
https://www.cnblogs.com/vincently/p/4526560.html
1、顺序索引的最大的缺点是随着文件的增大,索引查询性能和数据顺序扫描性能都会下降,需要频繁的重组来弥补这种性能的下降。
2、B+ 树索引
B+ 树索引结构在数据插入和删除的情况下仍能保持其执行效率。
B+ 树索引采用平衡树结构,其中树根到树叶的每条路径的长度相同,树中每个非叶结构由 [n/2] ~ n 个子女,其中 n 对特定的树是固定的。
B+ 树会增加文件插入和删除的性能开销,同时增加空间开销,但是对于更新频率较高的文件来说,这种开销是可以接受的,因为这样能够减少索引文件重组的成本。
3、B+ 树节点
要使 B+ 树索引为稠密索引,各搜索码的值都必须出现在叶子节点上,这是 B+ 树空间开销较大的原因。
B+ 树的非叶子节点形成叶节点上的一个多级(稀疏)索引。
B+ 树中节点的大小一般等于磁盘块的大小,通常为 4KB。如果搜索码的大小为 12 B(字节),指向磁盘的指针的大小为 8 B,那么一个节点的字节数最大为 $200 = 4000/(12 + 8) $。
如果搜索码的值共有 100万个,那么,一次查询只需要访问 4 个节点,也就是只需要从磁盘中加载 4 个磁盘块的数据。
4、B+ 树的更新
插入和删除要比查找更加复杂,因为节点可能由于更新,需要进行分裂或合并。
5、不唯一的搜索码
假如一个关系可以拥有多个包含同一搜索码值的记录,该搜索码称为不唯一的搜索码。
通常,通过创建包含原始搜索码和其他属性的复合搜索码来确保搜索码的唯一,提高删除记录的效率。
B+ 树扩展
1、B+ 树文件组织
B+ 树文件组织与 B+ 树索引不同,它的叶节点中存储的是记录而不是指向记录的指针。
在 B+ 树索引或 B+ 树文件组织中,树中相邻的叶节点可能分布在磁盘的不同位置。当一个文件组织最初建立在一组记录上的时候,可以实现把磁盘中基本连续的块分配给树中连续的叶节点,由此对叶节点的顺序扫描就相当于对磁盘上几乎是顺醋的扫描。随着在树中不断进行插入和删除操作,这种顺序性逐渐丢失,对叶节点的顺序访问也需要越来越频繁地等待磁盘寻道。为了恢复这种顺序性,需要对索引进行重建。
2、辅助索引和记录重定向
当叶节点分裂时,一些记录会移动到新的节点中,也就是说物理位置发生了变化,这种情况下,所有指向该记录的指针的索引都必须更新,尽管记录中的值并没有改变。
每个叶节点可能包含很多个记录,每条记录可能有多个辅助索引,导致叶节点分裂的操作代码极其高昂。
解决这类问题的方法是,在辅助索引中,存储主索引搜索码属性的值。用辅助索引定位一条记录需要两步:首先,用辅助索引找到主索引码的值,然后用主索引来找到对应的记录。这样,叶节点分裂时不再需要更新辅助索引,大大降低了由于文件重组导致的索引变更的成本。
3、前缀压缩技术
字符串属性的特点是:
- 长度可变
- 有可能很长
使用前缀压缩技术可以增加节点的扇出,不用在非叶节点存储整个搜索码的值,只存储每个搜索码值的一个前缀,使得这个前缀足以将由该搜索码值分开的两个子树中的码值区分开。
4、B+ 树索引的批量加载
索引的批量加载是指将大量索引项一次性的插入到索引中。
5、B 树索引
B 树索引与 B+ 树索引的区别是,B 树去除了搜索码值存储中的冗余。B 树只允许搜索码值出现一次,因此可以用比 B+ 树索引更小的树节点来存储索引。
B 树中的删除更加复杂。B 树在空间上的优势对大的索引来讲意义不大,通常不能抵消所带来的复杂性,因此,许多数据库系统实际采用 B+ 树索引。
6、闪存
闪存存储是通过块来组织的,并且 B+ 树索引结构可以在闪存存储中使用。相比于平均需要 10 毫秒来寻道和读块,闪存中的随机块读取在微妙级完成。
闪存的唯一确定是不允许物理层的数据点更新,每次更新操作时整个闪存块的一次拷贝加写操作,并清除旧的拷贝数据,一个块的清除需要 1 毫秒。
多码访问
1、多个单码索引查询
分别通过单码来检索出相应的记录,并做交集。
缺点是为了得到一个很小的结果集,必须扫描大量指针。
2、多码索引
在复合的搜索码上建立和使用的索引,称为多码索引。
3、覆盖索引
覆盖索引存储一些属性(但不是搜索码属性)的值以及指向记录的指针。覆盖索引能够减小搜索码的大小,使非叶节点中有更大的扇出,从而潜在地降低索引的高度。
静态散列 vs 动态散列
1、散列函数
桶用来表示能存储一条或多条记录的一个存储单位,通常一个桶就是一个磁盘块。
令 K 表示所有搜索码值的集合,令 B 表示所有桶地址的集合,散列函数 f 是一个从 K 到 B 的函数。
散列函数不可变的散列称为静态散列。
2、散列文件 vs 散列索引
顺序文件组织的一个缺点是必须访问索引结构来定位数据记录,或者必须使用二分法搜索。基于散列技术的文件组织,能够避免使用访问索引结构。
散列可以用于不同的目的,在散列文件组织中,通过计算所需记录搜索码值上的一个函数直接获得包含该记录的磁盘块地址;在散列索引组织中,把索引码以及与它们相关联的指针组织成一个散列文件结构。
3、散列函数
散列函数的设计需要认真仔细,一个糟糕的散列函数可能导致查找所花费的时间与文件中搜索码数据称正比。
4、开地址与闭地址
解决冲突的方法。
5、散列索引,将搜索码以及相应的指针组织称散列文件结构。
严格地说,散列索引只是一种辅助索引结构,散列索引从来不需要作为聚集索引结构来使用。因为如果一个文件自身是按散列组织的,就不必在其上另外建立一个独立的索引结构;如果非要使用散列索引作为聚集索引,那么为什么不直接使用散列文件组织呢?
6、动态散列技术允许散列函数动态改变,以适应数据库增大或缩小的需要。
7、可扩充散列
可扩充散列是一种动态散列技术,通过桶的分裂或合并来适应数据库大小的变化。
8、线性散列
9、顺序索引和散列的比较
通常设计者会使用顺序索引,除非明确知道将来不会频繁使用范围查询,才使用散列。