哈希索引(PostgreSQL 14 Internals翻译版)

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

概览

哈希索引提供了根据特定索引键快速查找tuple ID (TID)的功能。粗略地说,它只是一个存储在磁盘上的哈希表。哈希索引唯一支持的操作是根据相等条件进行搜索

当一个值插入到索引中时,将计算索引键的哈希函数。PostgreSQL哈希函数返回32位或64位整数;这些值中最低的几个位用作相应桶的编号。将TID和键的哈希码添加到所选的桶中。键本身不存储在索引中,因为这样处理固定长度的小值更方便。

索引的哈希表是动态扩展的。桶的最小数量是两个。随着索引元组数量的增长,其中一个存储桶被分成两个。该操作使用了多一位哈希码,因此元素仅在拆分产生的两个桶之间重新分布;哈希表的其他桶的组成保持不变。

索引搜索操作计算索引键和对应桶号的哈希函数。在所有桶内容中,搜索将只返回那些与键的哈希码对应的TID。由于bucket元素是按键的哈希码排序的,因此二进制搜索可以非常有效地返回匹配的TID。

由于键不存储在哈希表中,因此索引访问方法可能会由于哈希冲突而返回冗余的tid。因此,索引引擎必须重新检查访问方法获取的所有结果。出于同样的原因,不支持仅索引扫描

页面布局

与常规哈希表不同,哈希索引存储在磁盘上。因此,必须将所有数据安排到页中,最好是这样一种方式,即索引操作(搜索、插入、删除)需要访问尽可能少的页。

哈希索引使用四种类型的页面:

  • metapage—提供索引“目录”的页零
  • bucket pages—索引的主要页面,每个bucket一个
  • overflow pages—当主桶页不能容纳所有元素时使用的附加页
  • bitmap pages—包含位数组的页面,用于跟踪已被释放并可被重用的溢出页面

我们可以使用pageinspect扩展查看索引页。

让我们

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值