bloom

bloom 索引-基于指纹的索引

概览

扩展包名版本分类许可证语言
bloom1.0FEATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2990bloom-
相关扩展hll age rum pg_graphql pg_jsonschema jsquery pg_hint_plan hypopg

版本

PG18PG17PG16PG15PG14
1.01.01.01.01.0

安装

提示:这是 PostgreSQL 内核自带的 contrib 扩展

CREATE EXTENSION bloom;

用法

bloom: bloom 访问方法 - 基于签名文件的索引

bloom 扩展提供基于布隆过滤器的索引访问方法。布隆过滤器是一种空间高效的数据结构,用于测试元素是否属于集合,可能出现假阳性但不会有假阴性。

布隆索引特别适用于有很多列的表,且查询会测试列的任意组合的场景。单个布隆索引可以替代多个 btree 索引,同时占用显著更少的空间。

创建布隆索引

CREATE INDEX bloomidx ON tbloom USING bloom (i1, i2, i3, i4, i5, i6);

使用自定义参数:

CREATE INDEX bloomidx ON tbloom USING bloom (i1, i2, i3)
       WITH (length=80, col1=2, col2=2, col3=4);

参数

参数默认值最大值描述
length804096每个签名的位长度(取最近的 16 的倍数)
col1 - col3224095每个索引列生成的位数

运算符类支持

布隆索引仅支持等值运算符(=)。内置的运算符类适用于 int4text。你可以为有哈希函数的其他类型定义自定义运算符类:

CREATE OPERATOR CLASS text_ops
DEFAULT FOR TYPE text USING bloom AS
    OPERATOR    1   =(text, text),
    FUNCTION    1   hashtext(text);

示例

-- 创建一个多列表
CREATE TABLE tbloom AS
   SELECT
     (random() * 1000000)::int as i1,
     (random() * 1000000)::int as i2,
     (random() * 1000000)::int as i3,
     (random() * 1000000)::int as i4,
     (random() * 1000000)::int as i5,
     (random() * 1000000)::int as i6
   FROM generate_series(1, 10000000);

-- 单个布隆索引覆盖所有列组合
CREATE INDEX bloomidx ON tbloom USING bloom (i1, i2, i3, i4, i5, i6);

-- 对任意列子集的查询都可以使用该索引
SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451;

限制

  • 仅支持等值(=)查询(不支持范围查询)
  • 不支持 UNIQUE 索引
  • 不支持搜索 NULL
  • 由于假阳性,结果需要回表复核

最后修改 2026-03-12: update extension pages (f579993)