第三章 索引结构
1.索引结构基础
1.1 顺序文件
关系中元组按主码排序,然后元组按次序存在数据块中
1.2 稠密索引
对于排序的记录,在索引块中记录的键和指向记录的指针,不存储记录,稠密索引的意思就是对于每一个记录,在索引表里都有对应的(键<->指针)对,一 一对应的关系,不过这个都是分块的,假设一个索引块可以放4条,一个记录存储块放2条,那么一个索引块就对应了2个数据存储块
1.3 稀疏索引
相比稠密索引,稀疏索引就是在索引表中不存放所有的记录指针信息了,只存放一个存储块里第一个记录的指针(比如一个记录存储块内可以放2条记录,那么稀疏索引就是每隔2条存一个记录指针,而稠密索引是全部存下来的,举个最简单例子,假设键是1~100,那么稀疏索引表里面存的是1,3,5…,稠密索引是1,2,3…)
1.4 多级索引
可以建立多级索引,作用是啥呢,其实就是找两次,第一次先找到一个大区间,比如1~10,然后再二级索引,可能找到就是4~6了,这样比较快,但是需要注意,二级索引和后面的索引必须是稀疏的,要不然都是一 一对应,没啥用,需要的是范围搜索
1.5 辅助索引
辅助索引就单纯是一对一的查找了,辅助索引只知道每一个记录的指针,能找到,但是不影响记录的存储位置,所以不能像之前一样预测位置(就是大区间到小区间那样),现在就是不管你在哪,我也不care,反正我就一对一,你们记录之间有什么关系我不管,我就是能找到你,而且对于重复的,也是一个一个存,比如5个键为10的记录,索引表里就存5个记录
1.6 辅助索引的间接
间接就是中间放个桶,桶里面存放一样键值的记录,什么意思呢,就上面的例子,5个键值为10的记录,改成间接辅助索引就只在索引文件里放一个10,指向这个桶,桶再去找这5个记录,就是个间接索引了
2.B-树
2.1 B-树结构
B-树的规则:
- 根节点至少两个被使用
- 叶节点中,至少有(n+1)/2 向下取整个节点被使用,最后一个指向下一个
- 内层节点,每一个指针节点都是对键值节点的分区,有n个键值就有n+1个指针,比如键值是3,5,7,那么指针对应的就是<3, 3~5, 5~7,>7四个分区
B-树的应用
没太多说的
B-树查找
对于排序的就很简单了,跟二叉树差不多把B-树插入
简单总结一下:首先如果插入一个节点,能放下的话最好,放不下则需要分裂,分裂时保持性质(每个节点最少有(n+1)/2向下取整个键值指针对),所以老节点只留下(n+1)/2向上取整个,其他的放到新节点,保证新节点的键值指针对达到(n+1)/2向下取整,然后这样的话,父节点指针也多了一个,就得看看上面放不放得下,放不下也分裂,最多就e分’f裂到e根节点yn呗,根节点放不下也分裂
B-树删除
讲道理应该跟插入一个意思了,这个找个例子看看最明白B+树
区别就是非叶子节点都是一个键值和指针数相同,思路还是分区间,从大区间到小区间,然后叶子节点就是所有的键值信息,跟B-树区别在于所有信息都在叶子节点,只c有i到叶子节点才能搜索到键值记录B*树
就是要求必须装满2/3以上,不在是之前的一半了
前缀B树
简化键值,比如就拿个首字母去比,不用全部键值比了
3.Hash
3.1散列表
散列表,又称哈希表,把所有的键值按照一个函数映射到不同的K个桶里,比如对键值(假设为整数)对K取整,结果肯定就是0~K-1了,就这个意思
3.2 散列表插入
插入就算算哈希值,应该放到哪个桶,就放进去,处理冲突的办法,一般有链表法和线性探测法,具体不太明白可以查查数据结构
3.3 散列表删除
跟查找一样,找到就给删了就行了
3.4 可扩展散列表
下面以线性哈希来总结一下可扩展哈希吧,它保证了几个性质
- 桶数n的选择必须保证存储块的平均记录数大于某个值,比如80%,保证填满率
- 有三个参数,1.用后i位来算key,2.有n个桶 3.记录数r
所以就是r <= 1.7n,就是平均每个桶就1.7个,
线性哈希插入:
先用后i位算出来桶号,小于n的话就放进去,大于n就先放到m-2^i-1 的桶里,然后检查r/n是否满足性质,不行的话就加桶,加新桶比如是1a1a2a3…ai这个桶,就需要判定0a1a2a3…ai这个桶里的key是否有需要拿到新桶里面的,因为刚才不是给它暂时放那了嘛,这会儿物归原主,然后检验n是否大于2^i,大于的话取后i位就不够了,i++
还是那句话,这个可以找个例子最好,看一个小例子就会很清晰,或者自己找源码试试也行,我这大作业做过一个,有需要的可以留言。
这章就到这吧,下一章应该就查询执行了。