# 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