数据库原理 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)=(a∗key+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