数据库系统概念 第十一章 索引与散列

顺序索引:

  如果包含记录的文件按照某个搜索码指定的顺序排序,那么该搜索码对应的索引称为聚集索引

  搜索码指定的顺序与文件中记录的物理顺序不同的索引称为非聚集索引

  稠密索引和稀疏索引:

    索引项或索引记录由一个搜索码值和指向具有该搜索码值的一条或者多条记录的指针构成

    指向记录的指针包括磁盘块的标识和标识磁盘块内记录的块内偏移量

    稠密索引:

      文件中的每个搜索码值都有一个索引项。

      在稠密聚集索引中,索引项包括搜索码值以及指向具有该搜索码值的第一条数据记录的指针。

      具有同样搜索码值的其余记录顺序地存储在第一条数据记录之后,由于该索引是聚集索引,因此记录根据相同的搜索码值排序

      在稠密非聚集索引中,索引必须存储指向所有具有相同搜索码值的记录的指针列表

    稀疏索引:

      只为搜索码的某些值建立索引项,只有索引是聚集索引时才能使用稀疏索引

    稠密索引通常可以比稀疏索引更快地定位一条记录,稀疏索引占空间较小,而且插入和删除时所需的维护开销较小

  多级索引:

    在原始的内层索引上构造稀疏的外层索引

  索引的更新:

    插入:

      系统首先用出现在待插入记录中的搜索码值进行查找,并根据索引是稠密索引还是稀疏索引而进行下一个操作:

      稠密索引:

        1 如果该搜索码值不在索引中,系统就在索引中合适的位置插入具有该搜索码值的索引项

        2 否则进行如下操作:

          a 如果索引项存储的是指向具有相同搜索码值的所有记录的指针,系统就在索引项中增加一个指向新记录的指针

          b 否则,索引项存储一个仅指向具有相同搜索码值的第一条记录的指针,

            系统把待插入的记录放到具有相同搜索码值的其他记录之后

      稀疏索引:

        假设索引为每个块保存一个索引项,如果系统创建一个新的块,它会将新块中出现的第一个搜索码值(按照顺序)插入到索引中

        另一方面,如果这条新插入的记录含有块中的最小搜索码值,那么系统就更新指向该块地索引项

        否则,系统对索引不做任何改动

    删除:

      首先找到要删除的记录

      稠密索引:

        1 如果被删除的记录是具有这个特定搜索码值的唯一的一条记录,系统就从索引中删除相应的索引项

        2 否则

          a 如果索引项存储的是指向具有相同搜索码值的记录的指针,系统就从索引项中删除指向被删除记录的指针

          b 否则,索引项存储的是指向具有该搜索码值的第一条记录的指针。在这种情况下,

            如果被删除的记录是具有该搜索码值的第一条记录,系统就更新索引项,使其指向下一条记录

      稀疏索引:

        1 如果索引不包含具有被删除记录搜索码值的索引项,则索引不必做任何修改

        2 否则:

          a 如果被删除的记录是具有该搜索码值的唯一记录,系统用下一个搜索码值(按搜索吗顺序)的索引记录替换相应的索引

             记录,如果下一个搜索码值已经有一个索引项,则删除而不是替换该索引项

          b 否则,如果该搜索码值的索引记录指向被删除的记录,系统就更新索引项,使其指向具有相同搜索码值的下一条记录

  多码上的索引

    一个包含多个属性的搜索码称为复合搜索码

    这个索引的结构和任何其他索引一样,唯一不同的地方是搜索码是一个属性列表

 

 

 

 

B+树索引文件:

  B+树索引结构是在数据插入和删除的情况下仍能保持其执行效率的几种使用最广泛的索引结构之一。

  B+树索引采用平衡树结构,其中树根到树叶的每条路径的长度相同

  B+树增加文件插入和删除处理的性能开销,同时会增加空间开销,但是开销是可接受的

  B+树的结构:

  B+树的查询:

  B+树的更新:

    参考算法导论

 

 

 

多码访问:

  使用多个单码索引:

  多码索引:

    在复合的搜索码上建立和使用索引

 

 

 

 

静态散列:

  基于散列技术的文件组织使我们能够避免访问索引结构,散列也提供了一种构造索引的方法

  术语桶来表示能存储一条或多条记录的一个存储单位。

  令k表示所有搜索码值的集合,令B表示所有桶地址的集合,散列函数h是一个从k到B的函数,用h表示散列函数。

   散列函数:

    希望选择一个把搜索码值分配到桶中,并且具有下列分布特性的散列函数:

      1 分布是均匀的:

      2 分布是随机的:

  桶溢出处理:

    桶溢出的发生可能有以下几个原因:

      1 桶不足

      2 偏斜,某些桶分配的记录比其他桶多,原因:

        a 多条记录可能具有相同的搜索码

        b 所选的散列函数可能会造成搜索码的分布不均

    用溢出桶来处理桶溢出的问题:如果溢出再提供一个溢出桶,用一个链接列表链接在一起,称为溢出链

    这种形式的散列结构称为闭地址,较少称为闭散列

    开散列:桶集合是固定的,没有溢出链,当一个桶满了以后,系统将记录插入到初始桶集合的其他桶中,称为“线性探查法”

    开散列一般用在编译器和汇编器的符号表,在数据库实现中的重要性不大

  散列索引

    散列索引将搜索码及其相应的指针组织成散列文件结构

 

 

动态散列:

  可扩充散列:

    数据结构:

      当数据库增大或缩小时,可扩充散列可以通过桶的分裂或合并来适应数据库大小的变化。

  静态散列与动态散列比较:

    可扩充散列优点:

      其性能不随文件的增长而降低

      空间开销最小

    缺点:

      查找涉及一个附加的间接层

      实现时比较复杂

 

 

 

 

顺序索引和散列的比较:

  大多数数据库系统支持B+树索引,有可能还额外支持某种形式的散列文件组织或散列索引

  数据库设计者必须考虑以下问题:

    1 索引或散列组织的周期性重组代价是否可接受

    2 插入和删除的相对频率如何

    3 是否愿意以增加最坏情况下的访问时间为代价优化平均访问时间

    4 用户可能提出哪些类型的查询

 

 

 

位图索引:

  位图索引是一种为多码上的简单查询设计的特殊索引,尽管每个位图索引都是建立在一个码上的

   位图索引结构:

    位图就是位的一个简单数组。

    在其最简单的形式中,关系r的属性A上的位图索引是由A能取的每个值建立的位图构成的。

    每个位图都有和关系中的记录数相等数目的位。

 

 

 

 

SQL中的索引定义:

  SQL标准并未为数据库用户或管理员提供任何在数据库系统中控制创建和维护何种索引的方法

 

 

posted @ 2013-10-24 15:59  褐色键盘  阅读(972)  评论(0)    收藏  举报