# F.5.布鲁姆

F.5.1.参数F.5.2.例子F.5.3.操作员类接口F.5.4.局限性F.5.5.作者

开花提供了一种基于布隆过滤器 (opens new window).

Bloom过滤器是一种节省空间的数据结构,用于测试元素是否是集合的成员。对于索引访问方法,它允许通过签名快速排除不匹配的元组,签名的大小在索引创建时确定。

签名是索引属性的有损表示,因此容易报告误报;也就是说,当元素不在集合中时,可能会报告该元素在集合中。因此,必须始终使用堆条目中的实际属性值重新检查索引搜索结果。更大的签名可以降低误报的几率,从而减少无用的堆访问次数,但当然也会使索引更大,从而降低扫描速度。

当一个表有许多属性并且查询测试它们的任意组合时,这种类型的索引最有用。传统的btree索引比bloom索引快,但它可能需要许多btree索引来支持所有可能的查询,其中一个只需要一个bloom索引。但是请注意,bloom索引只支持相等查询,而btree索引也可以执行不等和范围搜索。

# F.5.1.参数

A.开花索引在其内部接受以下参数具有条款:

每个签名(索引项)的长度(以位为单位)。它被四舍五入到最接近的整数倍16.默认值为80位,最大值为4096.

col1-col32

为每个索引列生成的位数。每个参数的名称指的是它控制的索引列的编号。默认值是2.位,最大值为4095。未实际使用的索引列的参数将被忽略。

# F.5.2.例子

以下是创建bloom索引的示例:

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

创建索引时,签名长度为80位,属性i1和i2映射为2位,属性i3映射为4位。我们本可以省略, 可乐1可乐2规范,因为它们具有默认值。

下面是bloom索引定义和用法的更完整示例,以及与等效btree索引的比较。bloom指数比btree指数小得多,可以表现得更好。

=# 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);
SELECT 10000000

对这个大表进行顺序扫描需要很长时间:

=# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451;
                                              QUERY PLAN                                              
### F.5.3. Operator Class Interface

 An operator class for bloom indexes requires only a hash function for the indexed data type and an equality operator for searching. This example shows the operator class definition for the `text` data type:

使用bloom作为运算符1=(text,text),函数1 hashtext(text),为类型text创建运算符类text_ops默认值;

### F.5.4. Limitations

* Only operator classes for `int4` and `text` are included with the module.

* Only the `=` operator is supported for search. But it is possible to add support for arrays with union and intersection operations in the future.

* `bloom` access method doesn't support `UNIQUE` indexes.

* `bloom` access method doesn't support searching for `NULL` values.

### F.5.5. Authors

 Teodor Sigaev `<[teodor@postgrespro.ru](mailto:teodor@postgrespro.ru)>`, Postgres Professional, Moscow, Russia

 Alexander Korotkov `<[a.korotkov@postgrespro.ru](mailto:a.korotkov@postgrespro.ru)>`, Postgres Professional, Moscow, Russia

 Oleg Bartunov `<[obartunov@postgrespro.ru](mailto:obartunov@postgrespro.ru)>`, Postgres Professional, Moscow, Russia