概览
哈希索引提供了根据特定索引键快速查找tuple ID (TID)的功能。粗略地说,它只是一个存储在磁盘上的哈希表。哈希索引唯一支持的操作是根据相等条件进行搜索。
当一个值插入到索引中时,将计算索引键的哈希函数。PostgreSQL哈希函数返回32位或64位整数;这些值中最低的几个位用作相应桶的编号。将TID和键的哈希码添加到所选的桶中。键本身不存储在索引中,因为这样处理固定长度的小值更方便。
索引的哈希表是动态扩展的。桶的最小数量是两个。随着索引元组数量的增长,其中一个存储桶被分成两个。该操作使用了多一位哈希码,因此元素仅在拆分产生的两个桶之间重新分布;哈希表的其他桶的组成保持不变。
索引搜索操作计算索引键和对应桶号的哈希函数。在所有桶内容中,搜索将只返回那些与键的哈希码对应的TID。由于bucket元素是按键的哈希码排序的,因此二进制搜索可以非常有效地返回匹配的TID。
由于键不存储在哈希表中,因此索引访问方法可能会由于哈希冲突而返回冗余的tid。因此,索引引擎必须重新检查访问方法获取的所有结果。出于同样的原因,不支持仅索引扫描。
页面布局
与常规哈希表不同,哈希索引存储在磁盘上。因此,必须将所有数据安排到页中,最好是这样一种方式,即索引操作(搜索、插入、删除)需要访问尽可能少的页。
哈希索引使用四种类型的页面:
- metapage—提供索引“目录”的页零
- bucket pages—索引的主要页面,每个bucket一个
- overflow pages—当主桶页不能容纳所有元素时使用的附加页
- bitmap pages—包含位数组的页面,用于跟踪已被释放并可被重用的溢出页面
我们可以使用pageinspect扩展查看索引页。
让我们

本文概述了PostgreSQL中哈希索引的工作原理,包括哈希函数、桶的管理、动态扩展、页面布局以及溢出处理。重点介绍了索引的结构、搜索效率和性能影响因素。
最低0.47元/天 解锁文章
764

被折叠的 条评论
为什么被折叠?



