如何为Postgres 13.4的Bloom索引添加uuid等额外数据类型支持
Postgres 13.4 Bloom索引扩展多数据类型支持方案
前置准备
首先确保已在当前数据库安装bloom扩展:
CREATE EXTENSION IF NOT EXISTS bloom;
核心实现逻辑
Bloom索引默认仅支持int4和text类型,本质是官方预定义了这两个类型的操作符类绑定到bloom访问方法。要支持其他类型,只需为目标类型自定义对应操作符类,绑定该类型的等于操作符和内置哈希函数即可。
实操步骤(以uuid、int8为例)
步骤1:确认目标类型的哈希函数
Postgres内置了绝大多数常用类型的32位哈希函数,常用类型对应哈希函数参考如下:
- uuid:
uuid_hash(uuid) - int8/bigint:
hashint8(int8) - varchar/char:
hashvarlena(anynonarray) - date:
hashdate(date) - timestamp:
hashtimestamp(timestamp)
步骤2:创建对应类型的Bloom操作符类
为uuid类型添加支持
CREATE OPERATOR CLASS uuid_bloom_ops DEFAULT FOR TYPE uuid USING bloom AS -- 策略号1固定对应Bloom索引支持的等于查询 OPERATOR 1 = (uuid, uuid), -- 支持函数1固定对应哈希计算函数 FUNCTION 1 uuid_hash(uuid);
为int8(bigint)类型添加支持
CREATE OPERATOR CLASS int8_bloom_ops DEFAULT FOR TYPE int8 USING bloom AS OPERATOR 1 = (int8, int8), FUNCTION 1 hashint8(int8);
其他类型只需替换对应类型名和哈希函数即可。
步骤3:验证支持效果
操作符类创建完成后,即可直接构建包含对应类型字段的Bloom索引:
-- 示例:构建包含uuid、int8、text字段的联合Bloom索引 CREATE INDEX idx_bl_user_info ON user_info USING bloom (user_uuid, user_id, user_name);
可通过EXPLAIN ANALYZE执行等于条件查询,验证索引是否正常生效。
注意事项
- 创建操作符类需要数据库超级用户权限
- 自定义操作符类仅对当前数据库生效,跨数据库使用需要重复创建
- 若需要删除自定义操作符类,执行语句:
DROP OPERATOR CLASS IF EXISTS uuid_bloom_ops USING bloom CASCADE;,删除前需确认无依赖该操作符类的索引
内容的提问来源于stack exchange,提问作者Morris de Oryx
相关产品推荐
相关产品推荐

