跳到主要内容
版本: 最新版本-3.5

Bloom filter 索引

本主题介绍如何创建和修改 Bloom filter 索引,以及它们的工作原理。

Bloom filter 索引是一种节省空间的数据结构,用于检测已过滤数据是否可能存在于表的数据文件中。 如果 Bloom filter 索引检测到要过滤的数据不在某个数据文件中,StarRocks 会跳过扫描该数据文件。 当列(例如 ID)的基数相对较高时,Bloom filter 索引可以减少响应时间。

如果查询命中排序键列,StarRocks 可以使用前缀索引高效地返回查询结果。 但是,数据块的前缀索引条目不能超过 36 字节。 如果你想提高非排序键且基数相对较高的列的查询性能,可以为该列创建 Bloom filter 索引。

工作原理

例如,您在给定表 table1column1 上创建一个 Bloom filter 索引,并运行诸如 Select xxx from table1 where column1 = something; 的查询。 然后,当 StarRocks 扫描 table1 的数据文件时,会发生以下情况。

  • 如果 Bloom filter 索引检测到数据文件不包含要过滤的数据,StarRocks 会跳过该数据文件以提高查询性能。
  • 如果 Bloom filter 索引检测到数据文件可能包含要过滤的数据,StarRocks 会读取该数据文件以检查数据是否存在。 请注意,Bloom filter 可以肯定地告诉你一个值不存在,但它不能肯定地说一个值存在,只能说它可能存在。 使用 Bloom filter 索引来确定值是否存在可能会产生误报,这意味着 Bloom filter 索引检测到数据文件包含要过滤的数据,但数据文件实际上并不包含该数据。

使用说明

  • 您可以为 Duplicate Key 或 Primary Key 表的所有列创建 Bloom filter 索引。 对于 Aggregate 表或 Unique Key 表,您只能为 Key 列创建 Bloom filter 索引。
  • 可以为以下数据类型的列创建 Bloom filter 索引
    • 数值类型:SMALLINT、INT、BIGINT 和 LARGEINT。
    • 字符串类型:CHAR、STRING 和 VARCHAR。
    • 日期类型:DATE 和 DATETIME。
  • Bloom filter 索引只能提高包含 in= 运算符的查询的性能,例如 Select xxx from table where x in {}Select xxx from table where column = xxx
  • 您可以通过查看查询配置文件的 BloomFilterFilterRows 字段来检查查询是否使用了 Bloom filter 索引。

创建 Bloom filter 索引

您可以在创建表时通过在 PROPERTIES 中指定 bloom_filter_columns 参数来为列创建 Bloom filter 索引。 例如,为 table1 中的 k1k2 列创建 Bloom filter 索引。

CREATE TABLE table1
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048) REPLACE,
v2 SMALLINT DEFAULT "10"
)
ENGINE = olap
PRIMARY KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2)
PROPERTIES("bloom_filter_columns" = "k1,k2");

您可以通过指定这些列名一次为多个列创建 Bloom filter 索引。 请注意,您需要用逗号 (,) 分隔这些列名。 有关 CREATE TABLE 语句的其他参数说明,请参阅CREATE TABLE

显示 Bloom filter 索引

例如,以下语句显示 table1 的 Bloom filter 索引。 有关输出说明,请参阅SHOW CREATE TABLE

SHOW CREATE TABLE table1;

修改 Bloom filter 索引

您可以使用ALTER TABLE语句添加、减少和删除 Bloom filter 索引。

  • 以下语句在 v1 列上添加 Bloom filter 索引。

    ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
  • 以下语句减少 k2 列上的 Bloom filter 索引。

    ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
  • 以下语句删除 table1 的所有 Bloom filter 索引。

    ALTER TABLE table1 SET ("bloom_filter_columns" = "");

注意:更改索引是一个异步操作。 您可以通过执行SHOW ALTER TABLE来查看此操作的进度。 每次只能在一个表上运行一个更改索引任务。