ClickHouse跳数索引(Skip Index)的类型与选择策略
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 |