
• 元页面(meta page 第 0 页):包含有关索引的控制信息,指导如何找到其他页面(每个
bucket 的 primary page)。
hash index 将存储划分为多个 bucket(逻辑概念),每个 bucket 中包含若干 page(每个
bucket 的 page 数量不需要一致),当插入数据时,根据计算得到的哈希码,通过映射算法,
映射到某个 bucket,也就是说数据首先知道应该插入哪个 bucket 中,然后插入 bucket 中的
primary page,如果 primary page 空间不足时,会扩展 overflow page,数据写入 overflow
page。在 page 中,数据是有序存储(TREE),page 内支持二分查找(binarysearch),而
page 与 page 之间是不保证顺序的,所以 hash index 不支持 order by。
哈希桶页面• -索引的主页,将数据存储为“哈希码-TID”对。
溢出页面:是• bucket 里面的页,与哈希桶页面的结构相同,当 primary page 没有足够空间
时,扩展的块称为 overflow page。
位图页面:记录• primary page, overflow page 是否为空可以被重用。
从索引页元素开始的向下箭头表示 TID,即对表行的引用。
每次索引增加,PostgreSQL 即时创建的哈希桶(也就是页面)数量是上次创建的存储桶数量
的两倍。为了避免一次分配大量潜在的页面,版本 10 使大小增加更加平稳。对于溢出页面,
它们会根据需要进行分配,并在位图页面中进行跟踪,位图页面也会根据需要进行分配。
注意:哈希索引不能减小大小。如果删除一些索引行,则已经分配的页面不会返回给操作系统,
而只会在 VACUUM 之后重新用于新数据(通过 bitmappage 跟踪)。减小索引大小的唯一选
项是使用 REINDEX 或 VACUUM FULL 命令从头开始重建索引。
创建哈希索引:
create index on t1 using hash(name);
explain select * from t1 where name = '1f0e3dad99908345f7439f8ffabdffc4';
哈希索引的通用性远低于“ B-tree”,其效率也值得怀疑。因此,它是适用场景很小。
评论