01.数据库中的索引作用

db2的索引选择机制_聚集索引


db2的索引选择机制_结点_02

02.数据库索引种类

db2的索引选择机制_结点_03


03.评价索引效果

db2的索引选择机制_db2的索引选择机制_04


04.索引等于搜索码,一般就是一个或者几个实体集的属性

db2的索引选择机制_结点_05


顺序索引:

索引结构=索引表

一个索引结构与一个特定的搜索码有关

索引值=搜索码

db2的索引选择机制_搜索_06

01.聚集索引,非聚集索引:

聚集索引与文件的记录顺序有关,记录按搜索码的顺序存储的时候,索引是聚集索引

db2的索引选择机制_数据库_07


有聚集索引的文件叫做索引顺序文件

db2的索引选择机制_聚集索引_08


例子:

db2的索引选择机制_聚集索引_09


索引项:

db2的索引选择机制_搜索_10

顺序索引的另一种分法,有两种:

db2的索引选择机制_结点_11


搜索码不是主码,可以允许重复。

db2的索引选择机制_聚集索引_12


稀疏索引和聚集索引有关。例子:

db2的索引选择机制_数据库_13


db2的索引选择机制_数据库_14


db2的索引选择机制_数据库_15


字典就是稀疏索引

db2的索引选择机制_搜索_16


例子:

db2的索引选择机制_聚集索引_17


db2的索引选择机制_搜索_18


优缺点

db2的索引选择机制_聚集索引_19


多级索引:

例子:

db2的索引选择机制_聚集索引_20


db2的索引选择机制_db2的索引选择机制_21


解决方法1:

db2的索引选择机制_结点_22


方法2:

db2的索引选择机制_搜索_23


这个方法的例子:

db2的索引选择机制_数据库_24

db2的索引选择机制_搜索_25

db2的索引选择机制_搜索_26

索引的修改:

db2的索引选择机制_聚集索引_27


01.单层索引:

db2的索引选择机制_聚集索引_28


db2的索引选择机制_db2的索引选择机制_29


db2的索引选择机制_db2的索引选择机制_30

02.辅助索引

辅助索引是稠密索引的原因:

db2的索引选择机制_聚集索引_31


db2的索引选择机制_搜索_32


辅助索引和聚集索引的区别

db2的索引选择机制_结点_33

db2的索引选择机制_聚集索引_34

db2的索引选择机制_db2的索引选择机制_35

db2的索引选择机制_搜索_36


db2的索引选择机制_db2的索引选择机制_37


多码:

db2的索引选择机制_搜索_38

db2的索引选择机制_结点_39


字典序:在字典中,单词是按照首字母在字母表中的顺序进行排列的,比如 alpha 在 beta 之前。而第一个字母相同时,会去比较两个单词的第二个字母在字母表中的顺序,比如 account 在 advanced 之前,以此类推。


B+树索引

db2的索引选择机制_搜索_40

db2的索引选择机制_db2的索引选择机制_41

B+树全部结点:这里用指针数目为n,n表示子节点的数目

db2的索引选择机制_聚集索引_42


叶子结点:

db2的索引选择机制_db2的索引选择机制_43

db2的索引选择机制_数据库_44


叶子结点的值的个数:(n-1)/2 向上取整 n是指针个数

db2的索引选择机制_搜索_45


叶子结点的值的范围:

db2的索引选择机制_搜索_46

非叶子结点(内部结点):这里用指针n来约束

db2的索引选择机制_db2的索引选择机制_47


非叶子结点(内部结点)的指针:

db2的索引选择机制_结点_48

根结点:

db2的索引选择机制_结点_49

db2的索引选择机制_结点_50


n是指针的个数,上一层的结点会在这个结点的右子树的第一个元素出现:

db2的索引选择机制_结点_51


B+树的性质:

db2的索引选择机制_聚集索引_52

B+树的操作:

01.查找:

db2的索引选择机制_db2的索引选择机制_53


db2的索引选择机制_结点_54


db2的索引选择机制_db2的索引选择机制_55


过程:先在非叶子结点中找到Ki 大于等于 V ,因为B+树结点内部是顺序叶子结点:

db2的索引选择机制_结点_56

db2的索引选择机制_聚集索引_57

db2的索引选择机制_数据库_58

增强,如果有搜索码重复的话:

这段话是翻译的人自己写的

db2的索引选择机制_搜索_59

右兄弟: 在多叉树中right定义为: 一个结点的相邻右侧的兄弟结点!

这段话的意思如下图

例子:

db2的索引选择机制_数据库_60

db2的索引选择机制_搜索_61


db2的索引选择机制_db2的索引选择机制_62


在第二层的最右边的内部结点17,已经满足左子树也有元素等于17

如果第二层的结点,出现了10,17,18,就代表查找17就只能在中间的那个17开始查找,18的最多是左子树要看一下,18的右子树不用看,也就是pn指针

具体过程:

db2的索引选择机制_搜索_63


db2的索引选择机制_聚集索引_64


区间查找:

db2的索引选择机制_搜索_65


注解:

区间查找可以看一下这段代码

特定值查找

function find(v)
	1. C=root
	2. while (C is not a leaf node)
		1. Let i be least number s.t. V  Ki
		2. if there is no such number i then 
		3. Set C = last non-null pointer in C
		4. else if (v = C.Ki) Set C = Pi +1 
		5. else set C = C.Pi		//(v < C.Ki	) 
	3. if for some i, Ki = V then return C.Pi
	4. else return null /* no record with search-key value v exists. */

区间查找: 可在给定范围内查找具有搜索键值的所有记录

01.findRange(lb, ub):先遍历至find(lb)的叶子节点V,再从V开始往后遍历所有小于等于ub的记录
02.实际的实现通常提供一个迭代器接口(类似于游标)使用next()函数,一次获取一个匹配的记录

B+树的优势:

n是B+树的阶数

db2的索引选择机制_数据库_66

02.插入

一.叶子结点插入:

db2的索引选择机制_db2的索引选择机制_67


原图:

db2的索引选择机制_数据库_68


过程解释:

db2的索引选择机制_搜索_69


结果:

db2的索引选择机制_聚集索引_70


二.非叶子结点插入:

db2的索引选择机制_db2的索引选择机制_71

先插入叶子结点,让出现新的第二层结点:

db2的索引选择机制_db2的索引选择机制_72


第二层的结点大于上层指针,需要进一步分配

db2的索引选择机制_db2的索引选择机制_73


db2的索引选择机制_db2的索引选择机制_74

伪代码:可以不看

db2的索引选择机制_聚集索引_75


db2的索引选择机制_搜索_76

db2的索引选择机制_数据库_77

03.删除

叶结点

db2的索引选择机制_db2的索引选择机制_78


db2的索引选择机制_聚集索引_79

只能是Mozart结点到那里,Singh和wu会导致出现的新的叶节点不符合条件

db2的索引选择机制_数据库_80


db2的索引选择机制_db2的索引选择机制_81

db2的索引选择机制_数据库_82

db2的索引选择机制_数据库_83

db2的索引选择机制_聚集索引_84

db2的索引选择机制_数据库_85

不唯一搜索码

db2的索引选择机制_聚集索引_86


缺点:

db2的索引选择机制_结点_87


唯一化:

db2的索引选择机制_db2的索引选择机制_88

B+树文件组织:

树结点存储的是记录,不是指针

db2的索引选择机制_搜索_89


数字表示记录的长度

db2的索引选择机制_搜索_90


这里插入的是有搜索码值V的记录:这里判断的不是指针n的数量

db2的索引选择机制_搜索_91


db2的索引选择机制_db2的索引选择机制_92

具体过程:

db2的索引选择机制_结点_93


插入:

db2的索引选择机制_搜索_94


此时记录总数:2n

db2的索引选择机制_db2的索引选择机制_95


两个兄弟结点:叶结点是链表,(第一个和最后一个除外)中间结点有两个兄弟结点可以找到

db2的索引选择机制_聚集索引_96

文件记录块变化带来的问题:

db2的索引选择机制_数据库_97


方法:

db2的索引选择机制_聚集索引_98


db2的索引选择机制_聚集索引_99

db2的索引选择机制_结点_100

db2的索引选择机制_db2的索引选择机制_101


db2的索引选择机制_db2的索引选择机制_102


db2的索引选择机制_数据库_103