StarRocks中的N-gram布隆过滤器索引深度解析
什么是N-gram布隆过滤器索引
N-gram布隆过滤器索引是StarRocks数据库中的一种特殊索引类型,它基于传统的布隆过滤器索引进行了优化改进,专门用于加速字符串匹配查询。这种索引通过将字符串分割成固定长度的子串(称为n-gram)来构建索引,从而显著提升LIKE查询和特定字符串搜索函数的性能。
工作原理
N-gram布隆过滤器索引的核心思想是将字符串分解为多个固定长度的子串。例如,对于字符串"Technical":
-
当
gram_num
设置为4时,索引会将其分解为:- "Tech"
- "echn"
- "chni"
- "hnic"
- "nica"
- "ical"
-
每个子串都会被单独存入布隆过滤器索引中
这种分解方式使得索引能够更精确地匹配查询模式,特别是对于包含通配符的LIKE查询。
适用场景
N-gram布隆过滤器索引特别适合以下场景:
-
LIKE模糊查询:特别是包含通配符的查询,如
LIKE "%abc%"
或LIKE "abc%"
-
ngram_search函数:用于计算字符串相似度的函数
-
ngram_search_case_insensitive函数:不区分大小写的字符串相似度计算
创建与配置
基本创建语法
CREATE TABLE test.table1
(
k1 CHAR(10),
k2 CHAR(10),
v1 INT SUM,
INDEX index_name (k2) USING NGRAMBF (
"gram_num" = "4",
"bloom_filter_fpp" = "0.05"
) COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1);
关键参数说明
| 参数名 | 是否必填 | 说明 | 默认值 | 取值范围 | |--------|----------|------|--------|----------| | gram_num | 否 | 指定将字符串分割为多长的子串 | 2 | 正整数 | | bloom_filter_fpp | 否 | 布隆过滤器的误判率 | 0.05 | 0.0001-0.05 | | case_sensitive | 否 | 是否区分大小写 | true | true/false |
使用注意事项
-
表类型限制:
- 对于Duplicate Key或Primary Key表,可以为所有字符串类型列创建此索引
- 对于Aggregate或Unique Key表,只能为键列创建此索引
-
数据类型限制:仅支持CHAR、STRING和VARCHAR类型的列
-
索引互斥性:同一列上不能同时创建布隆过滤器索引和N-gram布隆过滤器索引
-
性能监控:可以通过查询profile中的
BloomFilterFilterRows
字段确认索引是否生效
索引管理
查看索引
SHOW CREATE TABLE table1;
SHOW INDEX FROM table1;
修改索引
添加新索引:
ALTER TABLE table1
ADD INDEX new_index_name(k1) USING NGRAMBF (
"gram_num" = "4",
"bloom_filter_fpp" = "0.05"
) COMMENT '';
删除索引:
ALTER TABLE table1 DROP INDEX new_index_name;
查询加速原理
LIKE查询加速
N-gram布隆过滤器索引能够加速LIKE查询的条件是:
- 查询字符串长度 ≥
gram_num
参数值 - 例如,当
gram_num=4
时:LIKE "%abc"
(3字符)无法加速LIKE "%abcd"
或LIKE "%abcde%"
可以加速
ngram_search函数加速
当使用ngram_search
函数时,如果:
- 查询列已创建N-gram布隆过滤器索引
- 函数指定的
gram_num
与索引的gram_num
一致
索引会自动过滤掉相似度为0的数据,大幅提升查询性能。
不区分大小写搜索
对于不区分大小写的搜索,需要在创建索引时设置case_sensitive=false
:
CREATE TABLE test.table1
(
k1 CHAR(10),
k2 CHAR(10),
v1 INT SUM,
INDEX index_name (k2) USING NGRAMBF (
"gram_num" = "4",
"bloom_filter_fpp" = "0.05",
"case_sensitive" = "false"
) COMMENT ''
)
ENGINE = olap
AGGREGATE KEY(k1, k2)
DISTRIBUTED BY HASH(k1);
最佳实践建议
-
gram_num选择:
- 较小的值(如2-4)适合短字符串匹配
- 较大的值(如5-8)适合长字符串精确匹配
- 需要根据实际查询模式调整
-
误判率设置:
- 对准确性要求高的场景使用较低值(如0.01)
- 对性能要求高的场景可适当放宽(如0.05)
-
索引维护:
- 定期监控索引使用情况
- 根据查询模式变化调整索引配置
通过合理配置N-gram布隆过滤器索引,可以显著提升StarRocks中字符串相关查询的性能,特别是在处理大量文本数据时效果尤为明显。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考