13.索引(补充内容:其他索引)
多键访问
如何加快以下查询的处理速度

多搜索键查询:(可能的策略)
- 首先利用该索引满足分支名称 branch-name < “ Perryridge ”,然后检查所得到的元组的balance
- 先分别获取符合两种要求的记录的指针,然后寻找指针的交集,最后才去根据指针获得记录
位图索引
位图索引是一种特殊类型的索引,旨在对多个键进行高效查询,针对涉及多种 search key 的查询设计
关系表中的记录按顺序编号为( R0, R1, R2,......)
- 给定一个数字 n,检索 Rn 的效率一定很高
对于取值个数有限的属性特别适用
- 例如,性别、国家、州,......
- 例如,收入水平(将收入划分为几个较小的等级,如0-9999元,10000-19999元,20000-5000 元,50000元及以上
最简单的形式是,它为属性(搜索键)的每个值都建有一个位图
- bitmap 长度( bit 个数 )为 record 的数量
- 每个 bitmap 代表某个属性的某个值在记录中的取值情况,某记录在该属性是该取值的话,则在此 bitmap 上值为 1,否则为 0
![image]()
位图索引对于多个属性的查询很有用,对于单个属性查询不是特别有用
使用位图操作来回答查询:bitmap operations
- 交集
- 并集
- 补集
每个操作需要两个位图并产生 bit 序列的答案
- 查询:男性并且收入水平是 L1:
![image]()
- 然后可以根据 bits 值检索所需的元组
如何处理记录的插入和删除
- 删除:把表示该记录的 bits 全设置为 0
- 额外创建一个 ExistenceBitmap,每个 bit 表示某记录的真实存在与否
- 插入:将记录追加到末尾或插入已删除的记录的位置
网格文件
- 网格文件的维度对应 search key 的个数
- 它的每个轴(维度)对应某个 key 的数值,并且被划分出若干区间,类似与标尺
![image]()
例子:两个属性( branch-name, balance )的网格文件可以以合理的效率处理以下所有形式的查询


在插入过程中,如果一个 bucket 满了
- 如果有多个单元格指向它,则可以创建一个新的存储桶,收容部分的单元格。想法类似动态哈希(分裂),但在多个维度上
- 如果只有一个单元格指向该存储桶,要么创建溢出桶,那么增加网格密度(每个 cell 变得更小,使得单个 bucket 装得下,不会溢出)
SQL 中的索引
- 索引用来非常快速地从数据库检索数据,用户看不到索引,它们只是用来加速查询/搜索
- 使用索引更新表要比不使用更新表花费更多的时间(因为索引也需要更新)。因此,仅在经常搜索的列上创建索引




浙公网安备 33010602011771号