doris 布隆过滤器索引

114 阅读2分钟

原理

布隆过滤器是一个二进制数字跟许多哈希函数聚集在一起的对象。他的目的是快速判断一个元素是否在布隆过滤器集合中,不能保证100%z正确。

二级制数组默认全部的值为0。当有元素存储到布隆过滤器时,会根据所有哈希函数算出下标,把这些下标上的值改成1。

判断元素是否存在集合中:元素经过所有的哈希函数计算后得到所有的偏移位置,若这些位置全都为1,则判断这个元素在这个集合中,若有一个不为1,则判断这个元素不在这个集合中。

布隆过滤器使用场景跟限制

1、高基数列上 2、只对In查询跟=查询有加速效果 3、不支持对tinyint/float/doouble列建立布隆过滤器索引

SQL

创建:
CREATE TABLE IF NOT EXISTS sale_detail_bloom  (
    sale_date date NOT NULL COMMENT "销售时间",
    customer_id int NOT NULL COMMENT "客户编号",
    saler_id int NOT NULL COMMENT "销售员",
    sku_id int NOT NULL COMMENT "商品编号",
    category_id int NOT NULL COMMENT "商品分类",
    sale_count int NOT NULL COMMENT "销售数量",
    sale_price DECIMAL(12,2) NOT NULL COMMENT "单价",
    sale_amt DECIMAL(20,2)  COMMENT "销售总金额"
)
Duplicate  KEY(sale_date, customer_id,saler_id,sku_id,category_id)
PARTITION BY RANGE(sale_date)
(
PARTITION P_202111 VALUES [('2021-11-01'), ('2021-12-01'))
)
DISTRIBUTED BY HASH(saler_id) BUCKETS 10
PROPERTIES (
"replication_num" = "3",
"bloom_filter_columns"="saler_id,category_id",  --创建布隆过滤器索引列
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-2147483648",
"dynamic_partition.end" = "2",
"dynamic_partition.prefix" = "P_",
"dynamic_partition.replication_num" = "3",
"dynamic_partition.buckets" = "3"
);

修改表增加布隆过滤器
ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "k1,k3");

删除:
ALTER TABLE <db.table_name> SET ("bloom_filter_columns" = "");

查询表的布隆过滤器:
SHOW CREATE TABLE <table_name>;

查询是否命中过滤器:
如果要查看某个查询是否命中了Bloom Filter索引,可以通过查询的Profile信息查看。