StarRocks中的N-gram布隆过滤器索引深度解析

StarRocks中的N-gram布隆过滤器索引深度解析

starrocks StarRocks是一个开源的分布式数据分析引擎,用于处理大规模数据查询和分析。 - 功能:分布式数据分析;大规模数据查询;数据分析;数据仓库。 - 特点:高性能;可扩展;易于使用;支持多种数据源。 starrocks 项目地址: https://gitcode.com/gh_mirrors/st/starrocks

什么是N-gram布隆过滤器索引

N-gram布隆过滤器索引是StarRocks数据库中的一种特殊索引类型,它基于传统的布隆过滤器索引进行了优化改进,专门用于加速字符串匹配查询。这种索引通过将字符串分割成固定长度的子串(称为n-gram)来构建索引,从而显著提升LIKE查询和特定字符串搜索函数的性能。

工作原理

N-gram布隆过滤器索引的核心思想是将字符串分解为多个固定长度的子串。例如,对于字符串"Technical":

  1. gram_num设置为4时,索引会将其分解为:

    • "Tech"
    • "echn"
    • "chni"
    • "hnic"
    • "nica"
    • "ical"
  2. 每个子串都会被单独存入布隆过滤器索引中

这种分解方式使得索引能够更精确地匹配查询模式,特别是对于包含通配符的LIKE查询。

适用场景

N-gram布隆过滤器索引特别适合以下场景:

  1. LIKE模糊查询:特别是包含通配符的查询,如LIKE "%abc%"LIKE "abc%"

  2. ngram_search函数:用于计算字符串相似度的函数

  3. 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 |

使用注意事项

  1. 表类型限制

    • 对于Duplicate Key或Primary Key表,可以为所有字符串类型列创建此索引
    • 对于Aggregate或Unique Key表,只能为键列创建此索引
  2. 数据类型限制:仅支持CHAR、STRING和VARCHAR类型的列

  3. 索引互斥性:同一列上不能同时创建布隆过滤器索引和N-gram布隆过滤器索引

  4. 性能监控:可以通过查询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函数时,如果:

  1. 查询列已创建N-gram布隆过滤器索引
  2. 函数指定的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);

最佳实践建议

  1. gram_num选择

    • 较小的值(如2-4)适合短字符串匹配
    • 较大的值(如5-8)适合长字符串精确匹配
    • 需要根据实际查询模式调整
  2. 误判率设置

    • 对准确性要求高的场景使用较低值(如0.01)
    • 对性能要求高的场景可适当放宽(如0.05)
  3. 索引维护

    • 定期监控索引使用情况
    • 根据查询模式变化调整索引配置

通过合理配置N-gram布隆过滤器索引,可以显著提升StarRocks中字符串相关查询的性能,特别是在处理大量文本数据时效果尤为明显。

starrocks StarRocks是一个开源的分布式数据分析引擎,用于处理大规模数据查询和分析。 - 功能:分布式数据分析;大规模数据查询;数据分析;数据仓库。 - 特点:高性能;可扩展;易于使用;支持多种数据源。 starrocks 项目地址: https://gitcode.com/gh_mirrors/st/starrocks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常韵忆Imagine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值