《数据库系统实现》第三章索引结构 学习笔记

第三章 索引结构

什么是及为什么需要索引

索引的概念

索引是定义在存储表(Table)基础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构,由一系列存储在磁盘上的**索引项(index entries)**组成,每一索引项又由两部分构成:

  • 索引字段:由Table中某些列(通常是一列)中的值串接而成。索引中通常存储了索引字段的每一个值。
  • 行指针:指向Table中包含索引字段值的记录在磁盘上的存储位置。

存储索引项的文件为索引文件,相对应,存储表又称为主文件

索引的一般性特点

索引文件是一种辅助存储结构,其存在与否不改变存储表的物理存储结构;然而其存在,可以明显提高存储表的访问速度

索引文件组织方式有两种:(相对照的,主文件组织有堆文件、排序文件、散列文件、聚簇文件等多种方式)

  • 排序索引文件(Orderedindices):按索引字段值的某一种顺序组织存储
  • 散列索引文件(Hashindices):依据索引字段值使用散列函数分配散列桶的方式存储

在一个表上可以针对不同的属性或属性组合建立不同的索引文件,可建立多个索引文件。索引字段的值可以是Table中的任何一个属性的值或任何多个属性值的组合值。

索引文件比主文件小很多。通过检索一个小的索引文件(可全部装载进内存),快速定位后,再有针对性的读取非常大的主文件中的有关记录。

有索引时,更新操作必须同步更新索引文件和主文件。否则会出现索引文件和主文件不一致的情况。

关于索引应用的评价问题

索引技术应用使检索效率大幅度提高,但同时其也增加了存储空间、使**维护负担加重(**不仅要维护主文件,而且要维护索引文件)

衡量索引性能好坏:

  • 访问时间
  • 插入时间
  • 删除时间
  • 空间负载
  • 支持存取的有效性,比如:支持的是属性的限定值(是否符合单一值),还是支持属性的限定范围的值(是否符合一定范围)

对哪些属性建立索引**:对经常出现在检索条件、连接条件、分组计算条件中的属性可建立索引。**

几个概念的澄清

  • 字段、排序字段(主文件中按哪个字段进行排序存储)、索引字段(索引文件中按哪个字段进行索引)
  • 码(key) 主键(primary key)具有唯一性和最小性
  • 排序码(OrderKey)—对主文件进行排序存储的那些属性或属性组
  • 索引码(IndexKey)—即索引字段,不一定具有唯一性
  • 搜索码(SearchKey)—在主文件中查找记录的属性或属性集
  • 主文件(存储数据的文件) 索引文件(存放索引的文件,可以没有)

SQL语言中的索引创建与维护

基本知识

  • 当定义Table后,如果定义了主键,则系统将自动创建主索引,利用主索引对Table进行快速定位、检索与更新操作;
  • 索引可以由用户创建,也可以由用户撤消
  • 当索引被创建后,无论是主索引,还是用户创建的索引,DBMS都将自动维护所有的索引,使其与Table保持一致,即:当一条记录被插入到Table中后,所有索引也自动的被更新
  • 当Table被删除后(droptable),定义在该Table上的所有索引将自动被撤消

创建和维护索引的SQL语句

索引可以由用户在任何属性上创建
创建索引:

CREATE [unique] INDEX indexname
ON tablename ( colname [asc | desc]
{
   
   , colname [asc | desc] . . .} );
// 在student表中创建一个基于Sname的索引
create index idxSname on student(sname);
// 在student表中创建一个基于Sname和Sclass的索引 两个属性值组合起来进行排序
create index idxSnamcl on student(sname, sclass);
// 如某索引不再需要,则可通过撤消命令,撤消用户创建的索引
DROP INDEX indexname;

索引应用要注意效果

选择哪些属性创建索引,以及如何创建与维护索引,如何利用索引改善数据库的运行性能,是DBA(数据库管理员)的重要职责。

是否建立和在哪些属性上建立索引需要考虑:访问时间、插入时间、删除时间与空间负载。既要改善性能,又要控制代价。

建立索引还需考虑索引的类型:索引如何支持存取的有效性,比如:支持的是属性的限定值(是否符合单一值),还是支持属性的限定范围的(是否符合一定范围)
对哪些属性建立索引**:对经常出现在检索条件、连接条件、分组计算条件中的属性可建立索引。**

稠密索引与稀疏索引

稠密索引和稀疏索引的概念

  • 对于主文件中每一个记录(形成的每一个索引字段值),都有一个索引项和它对应,指明该记录所在位置。这样的索引称稠密索引(denseindex)
  • 对于主文件中部分记录(形成的索引字段值),有索引项和它对应,这样的索引称非稠密索引(undense index)或稀疏索引(sparseindex)

稀疏索引如何定位记录

定位索引字段值为K的记录,需要

  • 首先找相邻的小于K的最大索引字段值所对应的索引项
  • 从该索引项所对应的记录开始顺序进行Table的检索

稀疏索引的使用要求—主文件必须是按对应索引字段属性排序存储

相比稠密索引:空间占用更少,维护任务更轻,但速度更慢
平衡:索引项不指向记录指针,而是指向记录所在存储块的指针,即每一存储块有一个索引项,而不是每条记录有一索引项----主索引

稠密索引如何定位记录

先查索引,然后再依据索引读主文件

索引文件中不存在搜索码的值,就代表着主文件中没有对应搜索码的记录

分为候选键属性上的稠密索引和非候选键上的稠密索引。候选键要求属性具有唯一性,可以做到一一对应。

非候选键属性上的稠密索引:

  • 索引文件中索引字段值是不重复的,主文件按索引字段排序且索引字段不是候选键。可以按索引字段找到相邻的字段。
  • 索引文件中索引字段值是有重复的,主文件未按索引字段排序且索引字段不是候选键。
  • 主文件未按索引字段排序且索引字段不是候选键,引入指针桶处理非候选键索引的多记录情况。

主索引与辅助索引

主索引

主索引通常是对每一存储块有一个索引项索引项的总数和存储表所占的存储块数目相同,存储表的每一存储块的第一条记录,又称为锚记录(anchor record), 或简称为块锚(block anchor)

  • 主索引的索引字段值为块锚的索引字段值,而指针指向其所在的存储块。
  • 主索引是按索引字段值进行排序的一个有序文件,通常建立在有序主文件的基于主码的排序字段上,即主索引的索引字段与主文件的排序码(主码)有对应关系

主索引是稀疏索引。

辅助索引

辅助索引是定义在主文件的任一或多个非排序字段上的辅助存储结构。

  • 辅助索引通常是对某一非排序字段上的每一个不同值有一个索引项:索引字段即是该字段的不同值,而指针则指向包含该记录的块或该记录本身;
  • 当非排序字段为索引字段时,如该字段值不唯一,则要采用一个类似链表的结构来保存包含该字段值的所有记录的位置。
  • 辅助索引是稠密索引,其检索效率有时相当高。

主索引vs. 辅助索引

  • 一个主文件仅可以有一个主索引,但可以有多个辅助索引
  • 主索引通常建立于主码/排序码上面;辅助索引建立于其他属性上面
  • 可以利用主索引重新组织主文件数据,但辅助索引不能改变主文件数据
  • 主索引是稀疏索引,辅助索引是稠密索引

其他类型的索引

聚簇索引和非聚簇索引

聚簇索引 是指索引中邻近的记录在主文件中也是临近存储的;
非聚簇索引 是指索引中邻近的记录在主文件中不一定是邻近存储的。

  • 如果主文件的某一排序字段不是主码,则该字段上每个记录取值便不唯一,此时该字段被称为聚簇字段;聚簇索引通常是定义在聚簇字段上。
  • 聚簇索引通常是对聚簇字段上的每一个不同值有一个索引项(索引项的总数和主文件中聚簇字段上不同值的数目相同),索引字段即是聚簇字段的不同值,由于有相同聚簇字段值的记录可能存储于若干块中,则索引项的指针指向其中的第一个块。
  • 一个主文件只能有一个聚簇索引文件,但可以有多个非聚簇索引文件
  • 主索引通常是聚簇索引(但其索引项总数不一定和主文件中聚簇字段上不同值的数目相同,其和主文件存储块数目相同);辅助索引通常是非聚簇索引。
  • 主索引/聚簇索引是能够决定记录存储位置的索引;而非聚簇索引则只能用于查询,指出已存储记录的位置。

倒排索引

广泛用于文本检索,文本查询的索引。搜索引擎对于文档进行检索。

找到以包含某个关键词的文档:以关键词为单位建立索引。

正排:一个文档包含了哪些词汇?

#Doc1, { Word1,Word2,… }

倒排:一个词汇包含在哪些文档中

Word1, { #Doc1, #Doc2, … }

对每个单词,引入中间结构,指向包含该单词的文档的地址的链表

其他结构索引

  • 多级索引:当索引项比较多时,可以对索引再建立索引,依此类推,形成多级索引

常见的多级索引形式,如B树/B+树索引,以树型数据结构来组织索引项等

  • 多属性索引:索引字段由Table的多个属性值组合在一起形成的索引
  • 散列索引:使用散列技术组织的索引
  • 网格索引(Gridfile):使用多索引字段进行交叉联合定位与检索

B+树(B+ Tree)

多级索引

当索引项比较多时,不能够一次性地装入内存时,可以对索引再建立索引,依此类推,形成多级索引。

B+树的基本概念

B+树索引:一种以树型数据结构来组织索引项的多级索引。

一个数据库中可以存储多个索引项。
在这里插入图片描述
B+树中每个节点都是这样的一个存储块。

  • •Ki—索引字段值
    •Pj—指针,指向索引块或数据块或数据块中记录的指针

索引文件,第一层为根节点,第二层为非叶节点,第三层为叶子节点。
在这里插入图片描述
主索引文件,第一层为索引文件的叶子节点。下面为主文件数据块。
在这里插入图片描述

B+树的特性:

  • 能够自动保持与主文件大小相适应的树的层次
  • 每个索引块的指针利用率都在50%-100%之间

B+树的存储约定

一块中存放多少个索引项(n的大小)?
在这里插入图片描述
有n-1个索引项(<索引字段值Ki, 指针Pi>)+1个指针(Pn);

索引字段值x在Ki-1与Ki之间的 的由Pi指向;而Ki与Ki+1之间的由Pi+1指向。

  • 非叶结点指针指向索引块,叶结点指针指向主文件的数据块或数据记录

  • 叶结点的最后一个指针可能不同于它的其他指针—始终指向其下一个数据块

  • 一索引块实际使用的索引指针个数d,满足(根结点除外):在n/2 与 n之间。

  • 根结点至少2个指针被使用。

有些索引字段值重复出现于叶节点和非叶节点的。

  • 指向主文件的指针仅出现于叶结点;
  • 所有叶结点即可覆盖所有键值的索引;
  • 索引字段值在叶结点中是按顺序排列的;

B+树是一种平衡树,如何保证:

  • 插入/删除记录时,伴随着结点的分裂与合并
  • 分裂与合并将调整部分结点块中的索引项

分裂与合并能够保证:

  • 自动保持与主文件大小相适应的树的层次
  • 每个索引块的指针利用率都在50%-100%之间

用B+树建立不同的索引

I. 用B+树建立键属性稠密索引

索引字段是主文件的主键,索引是稠密的。主文件可以按主键排序,也可以不按主键排序。指针指向的是记录。

II. 用B+树建立稀疏索引(或主索引)

索引字段是主文件的主键,索引是稀疏的。主文件必须按主键排序。
指针指向的是数据块

III. 用B+树建立非键属性稠密索引

索引字段是主文件的非键属性,索引是稠密的。主文件按非键属性排序
索引文件的索引字段是无重复的。指针指向的是记录。

IV. 用B+树建立非键属性稠密索引

•索引字段是主文件的非键属性。主文件不按此非键属性排序
•索引文件的索引字段值是有重复的。指针指向的是记录。

B+树vs. B树

不同之处

  • 索引字段值仅出现一次或者在叶结点或者在非叶结点; 而B+树在叶节点和非叶节点中可能重复出现。
  • 指向主文件的指针出现于叶结点或非叶结点; 而B+树只能出现在叶节点
  • 所有结点才能覆盖所有键值的索引。 而B+树只用叶子节点就可以覆盖所有键值的索引。

相同之处

  • 插入记录时,伴随着结点的分裂与合并; 规则不同
  • 层数相同–平衡

对比以下问题:

  • 一块中存放的索引项个数是否相同? B树中非叶节点需要增加指针指向主文件 B+树只有叶子节点有指向主文件的指针
  • 索引字段值都出现在哪里? B+树重复出现于叶节点和非叶节点,B树仅出现一次**或者在叶结点或者在非叶结点
  • 指向主文件的指针存在哪里?B+树都存在叶节点,B树则是非叶节点也可以存储。
  • 分裂与合并的方法是否一致? 原理是一致的,细微之处是有差别的

B+树还要考虑什么

如何利用B+树进行检索?
如何利用B+树进行增加和删除操作?
B+树的增加和删除操作时如何进行分裂和合并?
什么条件下分裂与合并?
分裂与合并时如何调整B+树的指针?

B+树之键值插入与结点分裂过程示意

猜你喜欢

转载自blog.csdn.net/qq_17677907/article/details/112003504