【Database System Concept 7th】Chapter 14 Indexing 读书笔记

Chapter 14 Indexing

  • 14.1 Basic Concepts
  • 14.2 Ordered Indices
    • 14.2.1 Dense and Sparse Indices
    • 14.2.2 Multilevel Indices
    • 14.2.3 Index Update
    • 14.2.4 Secondary Indices
    • 14.2.5 Indices on Multiple Keys
  • 14.3 B+-Tree Index Files
    • 14.3.1 Structure of a B+-Tree
    • 14.3.2 Queries on B+-Trees
    • 14.3.3 Updates on B+-Trees
    • 14.3.4 Complexity of B+-Tree Updates
    • 14.3.5 Nonunique Search Keys
  • 14.4 B+-Tree Extensions
    • 14.4.1 B+-Tree File Organization
    • 14.4.2 Secondary Indices and Record Relocation
    • 14.4.3 Indexing Strings
    • 14.4.4 Bulk Loading of B+-Tree Indices
    • 14.4.5 B-Tree Index Files
    • 14.4.6 Indexing on Flash Storage
    • 14.4.7 Indexing in Main Memory
  • 14.5 Hash Indices
    • 14.5.1 In Memory Hash
    • 14.5.2 Disk-Based Hash

14.1 Basic Concepts

众所周知,索引就是用于加快检索滴,就像书的目录一样,维护了主题到页数的映射,我们通过某个关键字查找主题,然后再跳转到某一页进行内容的查看。本章主要介绍一些常见的索引技术,主要是Hash索引B+tree索引,在本节让我们先了解一些基本概念。
有两种基本的索引类型:

  • 顺序索引:基于key进行顺序排序
  • 散列索引:将key散列到不同的hash桶中

索引技术非常多,适用于不同的场景,主要由以下几点衡量是否适用:

  • 访问类型:能支持的访问类型(包括查询具有特定属性值的记录、查询特定属性值在某个特定区间范围的记录)
  • 访问时间:找到一个特定记录或记录集所花费的时间
  • 插入时间:插入一个新记录所需要的时间
  • 删除时间:删除一个记录所需要的时间
  • 空间复杂度:维护索引结构所需要的空间开销

通常我们会在一个文件中建立多个索引,比如我们可能希望按照作者、主题或者书名来查找图书馆里的一本书。其中,用于查找的关键字称为搜索码,搜索码可以由一个或多个属性组成。

14.2 Ordered Indices

14.2.1 Dense and Sparse Indices

14.2.2 Multilevel Indices

14.2.3 Index Update

14.2.4 Secondary Indices

14.2.5 Indices on Multiple Keys

14.3 B±Tree Index Files

14.3.1 Structure of a B±Tree

14.3.2 Queries on B±Trees

14.3.3 Updates on B±Trees

14.3.4 Complexity of B±Tree Updates

14.3.5 Nonunique Search Keys

14.4 B±Tree Extensions

14.4.1 B±Tree File Organization

14.4.2 Secondary Indices and Record Relocation

14.4.3 Indexing Strings

14.4.4 Bulk Loading of B±Tree Indices

14.4.5 B-Tree Index Files

14.4.6 Indexing on Flash Storage

14.4.7 Indexing in Main Memory

14.5 Hash Indices

散列索引应用广泛,可以在内存中临时创建以处理join运算,也可以是主存数据库中的永久性结构,还可以是文件中记录的一种组织方式

14.5.1 In Memory Hash

散列索引的思想比较简单,即维护许多个存放记录的桶,每个桶存放若干条记录的指针。当插入记录时,通过某个哈希函数 h h h对记录中的搜索码取哈希值,根据这个哈希值,得到桶编号,将指向该记录的指针放入指定的桶中。
当有多条记录的搜索码哈希值一样时,桶中会存在多条记录,有许多不同的方式处理这种情况,目前我们描述的方式为溢出链方式,即每个桶为一条链表。
散列索引可以高效地支持搜索码上的相等查询,但不支持高效的范围查询

14.5.2 Disk-Based Hash

在基于磁盘的散列索引中,一个桶可由多个磁盘块组成,当插入一条记录时,与上述一致,先通过哈希函数定位桶,若目标桶仍有空间存放该记录,则存放;若空间不足以存放该记录,通过使用溢出桶来处理,也就是多分配一个桶,然后用链表串起来,如图所示。
【Database System Concept 7th】Chapter 14 Indexing 读书笔记_第1张图片
大量的桶溢出会导致查询速率变慢,为了处理这个问题,可以采用重构法来解决,即增多桶的数量,将记录重新通过哈希函数映射并插入新的桶中。但是,重构索引的缺点是如果这个relation中的记录数量很多,可能需要很多时间进行重构,可能阻塞事务的进行。
如上所述的方式称为静态散列,即索引创建时桶的数量是固定的;目前还有一些动态散列的方案,将于24.5节讨论。

你可能感兴趣的:(CMU,15-445,数据库,database)