数据库系统
2023-4-10~2023-4-16
第八周小结
第十五讲–数据库索引
1.索引,一种辅助存储结构,由一系列存储在磁盘上的索引项组成,每一索引项由索引字段(表中的若干列串接而成)、行指针(指向表中包含索引字段值的记录在磁盘上的存储位置)组成;
存储索引项的文件为索引文件,存储表为主文件;
索引文件存在与否不改变存储表的物理存储结构,但是可以明显提高存储表的访问速度;
2.索引文件组织方式
排序索引文件,按索引字段值的某一种顺序组织存储;
散列索引文件,依据索引字段值使用散列函数分配散列桶的方式存储;
3.索引文件比主文件小很多,可全部装载进内存;更新操作必须同步更新索引文件和主文件;
4.索引应用的评价
访问时间、插入时间、删除时间、空间负载、支持存取的有效性(如支持的属性的限定值、限定范围的值)
5.区分
码/主码,又称表键,具有唯一性、最小性;
排序码,对主文件进行排序存储的那些属性或属性组;
索引码,即索引字段,未必有唯一性;
搜索码,在主文件中查找记录的属性或属性集;
6.索引的创建和删除
7.稠密索引和稀疏索引
稠密索引,主文件中每一条记录都有一个索引项与之对应;
候选键属性的稠密索引–先查索引,再读主文件;
非候选键属性的稠密索引(索引字段值不重复):
非候选键属性的稠密索引(索引字段值重复):
非候选键属性的稠密索引(引入桶):
稀疏索引,主文件的部分记录,有索引项与之对应;
定位索引字段值为k的记录,先找到相邻的小于k的最大索引字段值的索引项,从该索引项对应记录开始顺序检索;
要求–主文件必须按照索引字段属性排序存储;
占用空间少、维护任务轻,但速度慢;
8.主索引(一种稀疏索引)
通常对每一存储块有一个索引项,索引项的总数与存储表占的存储块数目相同;存储表的每一存储块的第一条记录成为锚记录;
主索引的索引字段值为块锚的索引字段值,指针指向所在的存储块;
主索引是按索引字段值进行排序的有序文件;
9.辅助索引(一种稠密索引)
定义在主文件的任一或多个非排序字段上的辅助存储结构;
对某一非排序字段上的没一个不同值有一个索引项,指向记录的块/记录本身(每个记录都要有一个索引项对应,引入桶);
10.主索引与辅助索引对比
一个主文件仅有一个主索引,但辅助索引不唯一;
主索引常建立在主码/排序码上,但辅助索引可以建立在其他属性上;
利用主索引重新组织文件数据,但是辅助索引不能改变主文件数据;
主索引为稀疏索引,辅助索引为稠密索引;
11.聚簇索引与非聚簇索引
聚簇索引,索引中邻近的记录在主文件中是邻近存储的;
非聚簇索引,索引中邻近记录在主文件中不一定是邻近存储的;
若主文件中某一排序字段不是主码,则该字段上每条记录取值不唯一,此时该字段为聚簇字段(聚簇索引常定义在聚簇字段上);
一个主文件只有一个聚簇索引文件,但可以有多个非聚簇索引文件;
主索引常是聚簇索引,辅助索引常是非聚簇索引;
主索引/聚簇索引可以决定记录存储的位置,费聚簇索引只能用于查询;
12.倒排索引
13.其他结构的索引
多级索引–索引项较多时,对索引建立索引;(常见的有B树、B+树索引);
多属性索引–索引字段由表的多个属性值组合在一起的索引;
散列索引–使用散列技术组织的索引;
网格索引–使用多索引字段进行交叉联合定位与检查;
14.B+树索引(维护B+树不在这里)
有n-1个索引项(<索引字段值Ki,指针Pi>)和一个指针Pn;
索引字段值在[Ki-1,Ki)的由Pi指向,在[Ki,Ki+1)的由Pi+1指向;
存储块=4096B,整数型索引字段值为4B,指针为8B,n满足4(n-1)+8n≤4096
即n最大为341;
非叶结点指向索引块,叶结点指向主文件的数据块/记录,其中叶结点的最后一个指针始终指向下一个数据块;
建立不同的索引:
15.B树(平衡–层数相同)
索引字段值近出现一次(可以出现在非叶结点);
指向主文件的指针可以出现在非叶结点;
所有结点才能覆盖所有键值的索引;
16.散列
内存数据可采用散列确定存储页,主文件可采用散列确定存储块,索引可以用散列确定索引项的存储块;
一个桶可以是一个存储块,可以是若干个连续的存储块;
17.静态散列索引与动态散列索引
静态散列索引,桶的数目M不变(M过大则浪费,M过小则更多溢出桶);
动态散列索引,h(k)与桶的数目M相关;如可扩展散列索引、线性散列索引;
18.可扩展散列索引(保留题目)
直接上示例:
19.线性散列索引
与可扩展散列索引不同,线性散列索引是从右至左开始取。
i为取的位数,n为桶个数,r为存储记录数,要求r/n≤1.7,否则要分裂;
线性散列索引允许有溢出桶;
假设桶为,则该桶是由桶分裂而来的;
第十六讲–数据库查询算法实现(一趟扫描算法)
1.数据库的三大类操作
一次单一元组的一元操作,如选择selection、投影projection,可以使用迭代器算法;
整个关系的一元操作,如δ去重distinct、γ分组group by、τ排序sorting;
整个关系的二元操作,如集合上的操作(∩、∪、-)、包上的操作(∩、∪、-)、积product、连接join;
2.连接操作的逻辑实现–未考虑物理因素
TR为关系R的元组数目;
For i=1 to TR
Read i-th record of R;
For j=1 to TS
Read j-th record of S;
If R.A θ S.B
Then {串接i-th record of R和j-th record of S;存入结果关系}
Next j
Next i
3.关系是存储在磁盘上的,磁盘操作以块为单位,先载入内存,再元组处理;
B RxS = TRTS(IR+IS)/b;其中IR表示关系R的每个元组的字节数,b为每个磁盘块字节数,BR表示关系R的磁盘块数目;
4.连接操作基本实现P1–IO次数估计为BR+BRBS(忽略保存的IO次数);仅需要三个内存页即可;
For i = 1 to BR
Read i-th block of R;
For j = 1 to BS
Read j-th block of S;
For p = 1 to b/IR
Read p-th record of R;
For q = 1 to b/IS
Read q-th record of S;
If R.A θ S.B
Then{串接p-th record of R和q-th record of S;存入结果关系;}
Next q
Next p
Next j
Next i
5.连接操作全主存实现算法P2–IO次数估计为BR+BS(忽略保存的IO次数);假定M≥BR+BS(M是主存缓冲区的页数,每页容量为一个磁盘块容量)(一次能装入两个关系);
For i = 1 to BR
Read i-th block of R;
Next i
For j = 1 to BS
Read j-th block of S;
Next j
For p = 1 to TR
Read p-th record of R;
For q = 1 to TS
Read q-th record of S;
If R.A θ S.B
Then{串接p-th record of R和q-th record of S;存入结果关系;}
Next q
Next p
6.连接操作半主存实现算法P3–IO次数估计为BR+BS(忽略保存关系的次数);假设BS≥BR,BR<M(有一个关系可能装不进去);
For i = 1 to BR
Read i-th block of R;
Next i
For j = 1 to BS
Read j-th block of S;
For p = 1 to TR
Read p-th record of R;
For q = 1 to TS
Read q-th record of S;
If R.A θ S.B
Then{串接p-th record of R和q-th record of S;存入结果关系;}
Next q
Next p
Next j
7.连接操作的大关系实现算法P4–IO次数估计为BRBS/(M-2)+BS(忽略保存关系的次数);假设BS≥M,BR≥M;
把关系S分为BS/(M-2)个子集合,每个子集合有M-2个块。M-2块读入S,1块读入R,一块用作输出;
For i = 1 to BS/(M-2) //一次读入M-2个块,先处理M-2个块的所有R关系
Read i-th subset of S into MS;
For j = 1 to BR
Read j-th block of R into MR;
For p = 1 to (M-2)b/IS //每次操作一个元组
Read p-th record of S;
For q = 1 to b/IR
Read q-th record of R;
If R.A θ S.B
Then{串接p-th record of R和q-th record of S;存入结果关系;}
Next q
Next p
Next j
Next i
8.迭代器算法
抽象类iterator,不同的操作构造自己的open函数、getnext函数、close函数;
Class iterator{ void open();tuple getnext();void close();iterator &inputs[];}
9.关系/表数据的读取–完整地读取一个关系
聚簇关系–一个块中仅是一个关系的元组:
TableScan(R),未排序–BR
SortTableScan(R),排序–3BR
IndexScan(R),未排序–BR
SortIndexScan(R),排序–BR或3BR
非聚簇关系–一个块中不只是一个关系的元组:
扫描结果为排序–TR
扫描结果排序–TR+2*BR
10.去重复&(R)
内存中保存已处理过的元组,用于判断是否重复;
建立不同的内存数据结构,处理保存的数据;
算法复杂性BR;
应用条件B(&®)≤M;
11.分组聚集γ(R)
内存中保存所有的分组,保存每个分组上的聚集信息;
建立不同的内存数据结构,保存处理过的数据;
算法复杂性BR;
应用条件,所有分组数量能在内存中完整保存;
12.整个关系上的二元操作实现
集合、包上的∩、∪、-;
集合操作要去重;
包操作要计数(每一个元组出现的次数);
算法复杂性BR+BS;
应用条件,min(B®,B(S))≤M;
13.基于索引的选择算法
14.Zig-Zag连接算法