您现在的位置是:首页 > 行业发展

PostgreSQL的9.6黑科技绽放算法索引

智慧创新站 2025-04-30【行业发展】182人已围观

简介PostgreSQL确实是学术界和工业界的璀璨明珠,它总是喜欢将学术界的一些玩意工业化,这次的bloom又是一个代表。在PG很多的地方都能看到学术的影子,比如pgbench支持产生泊松分布,高斯分布的随机值。bloomfilter是一个有损过滤器,使用有限的比特位存储一些唯一值集合所产生的bits。...

PostgreSQL确实是学术界和工业界的璀璨明珠,它总是喜欢将学术界的一些玩意工业化,这次的bloom又是一个代表。

在PG很多的地方都能看到学术的影子,比如pgbench支持产生泊松分布,高斯分布的随机值。

bloomfilter是一个有损过滤器,使用有限的比特位存储一些唯一值集合所产生的bits。

通过这些bits可以满足这样的场景需求,给定一个值,判断这个值是否属于这个集合。

例如

使用所有的值,通过bloomfilter算法生成一个值val。

然后给定一个值例如100,判断100是否在中。

通过bloomfilter可以快速得到,不需要遍历表来得到。

判断方法是使用100和val以及统一的bloom算法。

可能得到的结果是trueorfalse。

true表示100在这里面,false表示100不在这里面。

必须注意,由于bloomfilter是有损过滤器,并且真的不一定为真,但是假的一定为假。

使用customaccessmethods接口定义了一个索引接口bloom,使用到它的特性:真的不一定为真,但是假的一定为假。

目前已实现的场景是,支持=查询,但是这个=会包含一些假的值,所以需要recheck。反过来,它如果要支持也是很方便的,并且不需要recheck。

使用PostgreSQL函数接口也能实现bloom过滤器。

bloom需要m个bit位。

添加元素时,需要k个hash函数,通过每一个hash和传入的值计算得到另一个值([0,m])。

得到的值用于设置对应的bit位为1。

例子

创建一个类型,存储bloom。

创建一个空的bloom,设置false值异常设置为TRUE的概率p,设置期望存储多少个唯一值n。

创建一个指纹函数,存储使用K个哈希函数得到的值,存入数组。

添加元素的函数

同样也是设置对应的bit为1

是否包含某元素

测试

以上例子来自pipelinedb文档,用C语言写成聚合函数,可以实现流式计算。

接下来是的例子,9.6是将它做成了索引,而不是聚合。

(如果有朋友想使用pipelinedb的bloom聚合,可以看看PIPELINEDB的代码,PORT过来)

多个字段测试,16个字段,任意测试组合,速度和recheck有关,recheck越少越好。

不仅仅支持and还支持or,只是OR的条件是bitmap的,会慢一些。

任意字段组合查询都能用上这个索引

如果使用其他的索引方法,任意条件组合查询,需要为每一种组合创建一个索引来支持。

而使用bloom索引方法,只需要创建一个索引就够了。

很赞哦!(77)