数据库索引 - 散列表索引

静态散列表索引:

散列表索引的原理是:通过一个散列函数,将键值映射为一个整数,每个整数对应一个桶。桶中存放[键值,数据记录指针]对的数组。在最简单的情况下,一个桶的大小小于一个块,因此只需要一次磁盘I/O就可以找到数据记录指针所在的块,然后在内存中扫描数组。合适的散列函数使每个桶分到的记录数相当,因此可以提高数据查询的平均时间。因为要经常运算,散列函数的计算复杂度应该比较简单。

静态散列表索引的缺点:当一个桶过大,需要建立溢出块。如果一个索引中大部分的桶都有溢出块,将影响查找效率。因此引入了动态散列表索引:可扩展散列表,线性散列表。

可扩展散列表索引

可扩展散列表索引中,散列函数返回值的位数是可增长的。当程序判断到桶已经被充满,将分裂散列函数返回值加1。例如,新插入的散列值是1,但是桶1已经充满,则将原来的桶1被分裂成桶01和桶11,再将桶中原有记录和新记录分配到两个桶中。同时,散列值数组中的所有散列值也要相应分裂,数组大小翻倍。因为大部分的桶中的数据并没有增加,因此可能出现多个散列值指向同一个桶的情况。
可扩展散列表索引的缺点:分裂散列值的代价过大。可能出现散列值数组大小远大于实际所需的情况。

线性散列表索引

线性散列表索引保持桶中的数据填充比率不超过某一个上限。
在数据整体填充率已经达到上限的情况下插入新值,将增加一个新桶,把原有桶的数据分配到两个桶中,然后,再为新的数据按规则选择桶。例如,试图插入新键值的时候,原有的桶0和桶1已经达到填充上限,因此将桶0和桶1分别改名为00和01,在增加新桶10。现在,为新的数据按规则选择桶。目前已经存在00,01,10三个桶,且数据整体填充率没有达到上限,桶01将存放散列值末尾数为1的键值指针对(注意:尾数11的键值也放在这个桶中),桶00和桶10分别存放散列值末尾数为00和10的键值指针对。
在数据整体填充率没有达到上限的情况下插入新值,如果新值所属的桶已经满了,则在该桶上建立溢出块,并插入新值。
在数据整体填充率没有达到上限的情况下插入新值,如果新值所属的桶还没充满,则在该桶上插入新值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值