01.数据库中的索引作用
02.数据库索引种类
03.评价索引效果
04.索引等于搜索码,一般就是一个或者几个实体集的属性
顺序索引:
索引结构=索引表
一个索引结构与一个特定的搜索码有关
索引值=搜索码
01.聚集索引,非聚集索引:
聚集索引与文件的记录顺序有关,记录按搜索码的顺序存储的时候,索引是聚集索引
有聚集索引的文件叫做索引顺序文件
例子:
索引项:
顺序索引的另一种分法,有两种:
搜索码不是主码,可以允许重复。
稀疏索引和聚集索引有关。例子:
字典就是稀疏索引
例子:
优缺点
多级索引:
例子:
解决方法1:
方法2:
这个方法的例子:
索引的修改:
01.单层索引:
02.辅助索引
辅助索引是稠密索引的原因:
辅助索引和聚集索引的区别
多码:
字典序:在字典中,单词是按照首字母在字母表中的顺序进行排列的,比如 alpha 在 beta 之前。而第一个字母相同时,会去比较两个单词的第二个字母在字母表中的顺序,比如 account 在 advanced 之前,以此类推。
B+树索引
B+树全部结点:这里用指针数目为n,n表示子节点的数目
叶子结点:
叶子结点的值的个数:(n-1)/2 向上取整 n是指针个数
叶子结点的值的范围:
非叶子结点(内部结点):这里用指针n来约束
非叶子结点(内部结点)的指针:
根结点:
n是指针的个数,上一层的结点会在这个结点的右子树的第一个元素出现:
B+树的性质:
B+树的操作:
01.查找:
过程:先在非叶子结点中找到Ki 大于等于 V ,因为B+树结点内部是顺序叶子结点:
增强,如果有搜索码重复的话:
这段话是翻译的人自己写的
右兄弟: 在多叉树中right定义为: 一个结点的相邻右侧的兄弟结点!
这段话的意思如下图
例子:
在第二层的最右边的内部结点17,已经满足左子树也有元素等于17
如果第二层的结点,出现了10,17,18,就代表查找17就只能在中间的那个17开始查找,18的最多是左子树要看一下,18的右子树不用看,也就是pn指针
具体过程:
区间查找:
注解:
区间查找可以看一下这段代码
特定值查找
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+树的阶数
02.插入
一.叶子结点插入:
原图:
过程解释:
结果:
二.非叶子结点插入:
先插入叶子结点,让出现新的第二层结点:
第二层的结点大于上层指针,需要进一步分配
伪代码:可以不看
03.删除
叶结点
只能是Mozart结点到那里,Singh和wu会导致出现的新的叶节点不符合条件
不唯一搜索码
缺点:
唯一化:
B+树文件组织:
树结点存储的是记录,不是指针
数字表示记录的长度
这里插入的是有搜索码值V的记录:这里判断的不是指针n的数量
具体过程:
插入:
此时记录总数:2n
两个兄弟结点:叶结点是链表,(第一个和最后一个除外)中间结点有两个兄弟结点可以找到
文件记录块变化带来的问题:
方法: