一、B+树
1.1 多级索引
1.1.1 概念
- 当索引项比较多时,可以对索引再建立索引,以此类推,形成多级索引
1.2 B+树的基本概念
- B+树索引:一种以树型数据结构来组织索引项的多级索引
- 一块中索引项的组织
- 索引字段值
- 指针,指向索引快或数据块中记录的指针
- 能够自动保持与主文件大小相适应的树的层次
- 每个索引块的指针利用率都在50%-100%之间
1.3 B+树的存储约定
1.3.1 一块中存放的索引项的数量
- 有n-1个索引项(<索引字段值,指针>)+1个指针()
- 索引字段值x在的指向;而的由指向
1.3.2 叶节点和非叶节点的指针指向
- 非叶节点指针指向索引块,叶节点指针指向主文件的数据块或数据记录
- 叶节点的最后一个指针可能不同于它的其他指针--始终指向其下一个数据块
- 一个索引块实际使用的索引指针个数d,满足(根节点除外):
- 根节点至少2个指针被使用
- 索引字段值重复出现于叶节点和非叶节点
- 指向主文件的指针仅出现于叶节点
- 所有叶节点即可覆盖所有健值得索引
- 索引字段值在叶节点中是按顺序排列的
- 级数(或层数)相同--平衡
- 插入/删除记录时,伴随着节点的分裂与合并
- 分裂与合并将调整部分节点块中的索引项
1.4 用B+树建立不同的索引
1.4.1 用B+树建立键属性稠密索引
- 索引字段是主文件的主键,索引是稠密的。主文件可以按主键排序,也可以不按主键排序。指针指向的是记录
1.4.2 用B+树建立稀疏索引(或主索引)
- 索引字段是主文件的主键,索引是稀疏的。主文件必须按主键排序
- 指针指向的是数据块
1.4.3 用B+树建立非键属性稠密索引
- 索引字段是主文件的非键属性,索引是稠密的。主文件按非键属性排序
- 索引文件的索引字段是无重复的。指针指向的是记录
1.4.4 用B+树建立非键属性稠密索引
- 索引字段是主文件的非键属性。主文件不按此非键属性排序
- 索引文件的索引字段值是有重复的。指针指向的是记录。
- 索引字段带有重复值的B+树的非叶节点示例
1.5 B+树 VS B树
1.5.1 B树
- 索引字段值仅出现一次或者在叶结点或者在非叶结点
- 指向主文件的指针出现于叶结点或非叶结点
- 所有结点才能覆盖所有键值的索引
二、B+树之键值插入与结点分裂过程示意
2.1 插入
- 在下列B+树中插入键值为40的记录
- 过程
- 关键:
- 分裂
- 由叶结点向根结点逐层处理
- 指针调整
2.2 删除
- 在下列B+树中删除键值为7的记录
- 过程
- 问题2:删除键值为11的记录
- 关键
- 合并
- 由叶结点向根结点逐层处理
- 指针调整
三、散列索引
3.1 散列的基本概念
- 有M个桶,每个桶是有相同容量的存储地
- 散列函数,可以将键值k映射到中的某一个值
- 将具有键值k的记录Record(k)存储在对应编号的桶中
- 目标:选择一个合适的散列函数,将一个Record集合(每个Record都包含一个关键字k)均匀地映射到M个桶中。即:对于集合中任一个关键字,经散列函数映射到地址集合中任何一个地址的概率是近乎相等的。
3.2 散列索引
- 内存数据可采用散列确定存储页,主文件可采用散列确定存储块,索引亦可采用散列确定索引项的存储块
- M个桶。一个桶可以是一个存储块,亦可是若干个连续的存储块
3.3 散列的问题
- 散列索引的目标
- 最好是没有溢出桶,每一个散列值仅有一个桶。读写每一个键值都只读写一个存储块
- 期望将所有数据分布均匀地存储于M个桶中,使每一个桶的额数据成为具有某种特征值的数据集合。---散列函数的选择
- 桶的数目M的确定
- 在键值几倍于桶的数目时,每个散列值都可能多于一个桶,形成一个主桶和多个溢出桶的列表,此时需要二次检索:先找到主桶号,再依据链表逐一找到每个溢出桶。
- 桶的数目M是固定值---静态散列索引
- 如果桶的数目M不变:M过大,则浪费;M过小,则将产生更多的溢出桶,增加散列索引的时间
- 桶的数目随键值增多,动态增加---动态散列索引
- 是和桶的数目M相关的。