数据库系统实现——chaptor 3 索引结构

索引是这样一种数据结构:它以一个或多个字段的值为输入,并能“快速地”找出具有该值的记录。
具体来说,索引是我们只需要查看所有可能记录中的一小部分就能找到所需记录。简历索引的字段(组合)成为查找键,在索引不言而喻时也可称“键”。

1.1稠密索引

稠密索引是一系列的存储块:块中只存放记录的键以及指向记录本身的指针,即一对一。
数据库系统实现——chaptor 3 索引结构_第1张图片
特点:空间大,时间少
优势
1.索引块数量通常比数据块的数量少
2.由于键被排序,我们可以是用二分查找发来查找K。若有n个索引快,我们只需要查找log2(n)个块
3.索引文件可能足够小,以至可以永久的存放在主存缓冲区中。因此,查找键K时只需涉及主存访问而不需执行I/O才注意
缺点:占用空间大

1.2稀疏索引

稀疏索引只为数据文件的每个存储块设一个键-指针对,即一对多。
数据库系统实现——chaptor 3 索引结构_第2张图片
特点:空间小,时间多

1.3多级索引

在索引上再建索引,我们能够使第一级索引的使用更为有效。
数据库系统实现——chaptor 3 索引结构_第3张图片

1.4辅助索引

这种数据结构有助于查找给定一个或多个字段值的记录。但是,辅助索引与主索引最大的差别在于辅助索引不决定数据文件中记录的存放位置。而仅仅告诉我们记录的当前存放位置,这一位置可能是由建立再其他某个字段上的主索引确定的。

辅助索引总是稠密索引。因为辅助索引不影响记录的存储位置,我们也就不能根据它来预测键值不在索引中显式指明的任何记录的位置。

数据库系统实现——chaptor 3 索引结构_第4张图片
如图所示结构存在空间浪费,加入某个索引键值在数据文件中出现n次,那么这个键值在索引文件中就要写n次,如果我们只为指向该键值的所有指针存储一次键值,这样会比较好。

1.4.1 辅助索引中的间接

避免键值重复的一种简便方法是是用一个称为桶的间接层,它介于辅助索引文件和数据文件之间。
数据库系统实现——chaptor 3 索引结构_第5张图片

我们通常可以在不访问数据文件记录的前提下利用桶的指针来帮助回答一些查询。

例如查询影视作品的演员和日期
数据库系统实现——chaptor 3 索引结构_第6张图片

1.4.2文档检索和倒排索引

倒排索引不是倒过来找

常规的索引是文档到关键词的映射:
文档——>关键词
但是这样检索关键词的时候很费力,要一个文档一个文档的遍历一遍。(这事不能忍~)于是人们发明了倒排索引~倒排索引是关键词到文档的映射
关键词——>文档
这样,只要有关键词,立马就能找到她在那个文档里出现过,剩下的事就是把她揪出来了~~~可能是因为将正常的索引倒过来了吧,所以大家叫他倒排索引,可我依然喜欢叫他反向索引

数据库系统实现——chaptor 3 索引结构_第7张图片

2.1B-树

B-树的是用原因(相比一级或两级索引)
1. B-树能自动的保持与数据文件大小相适应的索引层次
2. 对所使用的存储块空间进行管理,使每个块的充满成都在半满与全满之间

通常B-树有三层:根、中间层和叶
对应于每个B-树索引都有一个参数n,它对应着B-树的存储布局。每个存储块只能存放n个查找键值和n+1个指针。且整数型键值占4个字节,指针占8个字节。假设存储块的大小为4096个字节,那么4n+8(n+1)≤4096,n=340个,也就是一个节点可以放340个。
数据库系统实现——chaptor 3 索引结构_第8张图片

2.1.1B-树的查找

抓住B-树的顺序特点
比如说查找图3-13中的40,先从根节点13开始,13<40,所以往右走,发现31<40<43,在这个节点,我们来到包含31、37、40的叶节点,所以可以断定没有键值为40的记录。

2.1.2B-树的插入

  1. 先找到适当的节点,如果有空,直接插入
  2. 如果没空,就把该节点分裂
    比如要往图3-13中插入40这个值
    发现(31,37,41)这个节点已经满了,所以选择分裂
    数据库系统实现——chaptor 3 索引结构_第9张图片
    检查上层节点,发现不满足B-树的规则,因此需要调整上层

2.1.2B-树的删除

借:删除了后,如果旁边节点可以借一个过来,则不需要改变自己的节点结构,此方法最好。
数据库系统实现——chaptor 3 索引结构_第10张图片

合:删除之后,如果旁边节点已经不能借一个过来了,则需要合并节点。
数据库系统实现——chaptor 3 索引结构_第11张图片
上层节点的5已经不满足B-树的规则,所以需要调整为13
数据库系统实现——chaptor 3 索引结构_第12张图片

3.1散列表

散列表(Hash table,也叫哈希表),是根据关键码值(Key
value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

3.1.1散列表插入

数据库系统实现——chaptor 3 索引结构_第13张图片
这个时候我还想插入,如果桶的所有存储块都没有空间,我们就增加一个新的溢出块到该桶的链上:

h(e) = 1

数据库系统实现——chaptor 3 索引结构_第14张图片

3.1.2散列表的删除

数据库系统实现——chaptor 3 索引结构_第15张图片
如果我删除C,会遇到合并情况,则如下图所示;
数据库系统实现——chaptor 3 索引结构_第16张图片

3.2扩展散列表

数据库系统实现——chaptor 3 索引结构_第17张图片
接下来,有一条插入语句:

Insert 1010

这个时候根据第一位数字已经无法分类,所以我需要细分,即用前两位进行分类
数据库系统实现——chaptor 3 索引结构_第18张图片

以此类推。。

你可能感兴趣的:(--2.1Database,--读后感,索引结构,哈希表,B-树,稠密索引,稀树索引)