bill的数据库学习笔记:基于hash的 indexes索引

数据库原理 Hash indexes

  • 基于hash的index对于确认的选择是最好的,但是对于范围选择来说效果不佳。
  • 基于hash的选择包括静态hashing方法以及动态hashing方法

1. 静态hashing

Pages 是不变的,按sequential的方式分配,不会被重新分配。
如果出现多个pages,则使用overflow。hash到的每一个bucket包含所需要的数据。

在这里插入图片描述

  • 每个hash function使用key作为参数,必须要从0-M-1进行分配。
  • h ( k e y ) = ( a ∗ k e y + b ) h(key)=(a*key+b) h(key)=(akey+b)的当时经常可以很好的运行
  • a和b是常数
  • overflow的pages的会通过linked list的方式连到每一个bucket的后面。
  • 很长的链子会使得整个算法的性能变差

2. Extendible Hashing

  • 当bucket被填满时,为何不倍增bucket的数量?
  • Idea:使用pointers的列表,doubling directory,并且将一个overflow的bucket进行分为2个。
  • directory目录比文件要小的多,所以让他双倍是更加便宜的。只有一个data entries被分成2个,因此不会出现页的overflow。

举个例子:

在这里插入图片描述

  • 维护Global depth和Local depth2个数
  • 当我们尝试insert一个数据时,如果要insert的bucket满了,则将这个bucket split
  • 如果有需要,则将目录部分变为原来的2倍

需要doubling的情况

在这里插入图片描述

在这里插入图片描述
第一种情况,需要doubling,我们可以看到,最开始local depth和global depth都为2,我们尝试输入20,20对应的二进制为10100,则属于bucket A,但是bucket A这里只能有4个数据,那么我们将其进行split为 bucket A和bucket A2,i.e 5个数至少需要3bit来进行区分。
由于其最后2位为0,并且如果考虑最后三位,按照倒数第三位的为0和1进行区分,可以分为 32、16以及4、12、20这2类,那么我们也将directory进行doubling

当local depth大于global depth,则进行directory doubling的操作

Directory Doubling,为何使用least significant

在这里插入图片描述
在进行directory doubling的时候,可以直接copy旧的到新的位置最底层的位置

Delete:
如果数据的removal使得bucket空了,则可以进行融合。

3. Linear Hashing

Linear hashing不适用directory的方式来处理overflow chain,并且能够很好的处理duplicates

Idea: 使用很多的hash function

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值