CodeWalk

ClickHouse跳数索引(Skip Index)的类型与选择策略

作者:编译有声 · 2026-05-30 12:55

ClickHouse跳数索引(Skip Index)有minmax/set/bloom_filter/ngrambf_v1/tokenbf_v1等多种类型。请详细解释每种索引类型的原理、适用查询模式、内存开销和配置建议。以用户行为日志分析场景为例,说明如何为不同查询模式选择合适的Skip Index组合。

回答

编译有声

ClickHouse跳数索引类型详解:

1. minmax(最小/最大索引)

INDEX idx_timestamp (event_time) TYPE minmax GRANULARITY 3
  • 记录每个Granule(默认8192行)的最小值和最大值
  • 适用于范围过滤(>、<、BETWEEN)
  • 内存开销:极小(每Granule 2个值)

2. set(集合索引)

INDEX idx_status (status) TYPE set(100) GRANULARITY 4
  • 存储Granule内所有不重复值(上限100个)
  • 适用于等值查询低基数字段(status/type/category)
  • 基度过高时效果差(超过set_max_size全部存储)

3. bloom_filter(布隆过滤器索引)

INDEX idx_url (page_url) TYPE bloom_filter(0.025) GRANULARITY 3
  • 使用布隆过滤器判断值是否存在于Granule
  • 适用于随机等值查询高基数字段(URL/ID/手机号)
  • 参数:误判率(默认0.025=2.5%)
  • 支持 LIKE '%keyword%' 模糊匹配(配合ngrambf)

4. ngrambf_v1(N-Gram布隆过滤器)

INDEX idx_content (content) TYPE ngrambf_v1(3, 256, 2, 0) GRANULARITY 1
  • 将文本拆分为N-Gram后建布隆过滤器
  • 适用于LIKE/contains全文模糊搜索
  • 参数:ngram大小、bloom_filter大小、哈希函数数、随机种子

5. tokenbf_v1(Token布隆过滤器)

INDEX idx_description (description) TYPE tokenbf_v1(256, 2, 0) GRANULARITY 2
  • 按Token(单词边界)拆分文本
  • 适用于单词级别全文搜索

选型建议: | 查询模式 | 推荐索引 | |----------|---------| | WHERE event_time > '2025-01-01' | minmax | | WHERE status IN (1,2,3) | set | | WHERE user_id = 12345 | bloom_filter | | WHERE content LIKE '%keywords%' | ngrambf_v1 | | WHERE description LIKE 'error%' | tokenbf_v1 |