数据库索引 - 散列表索引

来源:互联网 发布:mysql添加外键约束 编辑:程序博客网 时间:2024/05/29 15:34

静态散列表索引:

散列表索引的原理是:通过一个散列函数,将键值映射为一个整数,每个整数对应一个桶。桶中存放[键值,数据记录指针]对的数组。在最简单的情况下,一个桶的大小小于一个块,因此只需要一次磁盘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的键值指针对。
在数据整体填充率没有达到上限的情况下插入新值,如果新值所属的桶已经满了,则在该桶上建立溢出块,并插入新值。
在数据整体填充率没有达到上限的情况下插入新值,如果新值所属的桶还没充满,则在该桶上插入新值。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天下行以租代购要起诉我怎么办 顺丰收件人电话地址都写错了怎么办 领导问任务完不成怎么办怎么回答 我和我老婆感情出现问题了怎么办 手机坏了手机浏览器里照片怎么办 不小心把电脑ie浏览器删了怎么办 华为手机自带浏览器中病毒了怎么办 手机打开浏览器提示中病毒了怎么办 手机卸载了浏览器和软件商店怎么办 房东在我租房期间贴房子出租怎么办 额头上毛孔大 还有些黑怎么办 孩子学跳舞老师压的疼怎么办 步步高点读机电池坏了怎么办 电脑连接受限制或无连接怎么办 电脑无线网受限制或无连接怎么办 电脑网络受限制或无连接怎么办 3 证书报考大专证书丢了怎么办 广工期末考试被老师警告了怎么办 我在农村不当队长我能力不够怎么办 我在农村不当队长我当代表怎么办 北京本地人社保中间断了一年怎么办 我想把大哥的孩子带出国要怎么办 美国有亲戚想让孩子出国怎么办 连接温控器的线断了怎么办 植发后好多原生发都脱落了怎么办 4岁宝宝支体能力差怎么办 当与游客发生矛盾时员工怎么办 顾客与同事发生矛盾你该怎么办 当一个人犯下的过错难以原谅怎么办 开车把别人撞成植物人了该怎么办 结婚证丢了孩子上不上学了怎么办 办房产证前加户主姓名怎么办手续 孩子上学户口跟房产不在一起怎么办 我家小孩被别的家长打了怎么办 要是小孩骗家长说老师打他怎么办 孩子在学校被家长打小孩怎么办 小孩在学校被老师打淤青家长怎么办 小孩和家长一吵架就说死怎么办 王者荣耀号被别人家长联接了怎么办 儿子12岁总是跟大人顶嘴怎么办 课堂上有学生和你顶嘴你怎么办