13.索引(补充内容:其他索引)

多键访问

如何加快以下查询的处理速度
image

多搜索键查询:(可能的策略)

  • 首先利用该索引满足分支名称 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 )的网格文件可以以合理的效率处理以下所有形式的查询
image
image

在插入过程中,如果一个 bucket 满了

  • 如果有多个单元格指向它,则可以创建一个新的存储桶,收容部分的单元格。想法类似动态哈希(分裂),但在多个维度上
  • 如果只有一个单元格指向该存储桶,要么创建溢出桶,那么增加网格密度(每个 cell 变得更小,使得单个 bucket 装得下,不会溢出)

SQL 中的索引

  • 索引用来非常快速地从数据库检索数据,用户看不到索引,它们只是用来加速查询/搜索
  • 使用索引更新表要比不使用更新表花费更多的时间(因为索引也需要更新)。因此,仅在经常搜索的列上创建索引
posted @ 2024-12-15 14:42  韦飞  阅读(34)  评论(0)    收藏  举报