- minmax:跟踪每个块中某个表达式的最小值和最大值。非常适合针对大致有序的数据执行范围查询。
- set(N):跟踪每个块中最多 N 个值的集合。对于每个块内基数较低的列非常有效。
- text:在分词后的字符串数据上构建倒排索引,从而实现高效且确定性的全文搜索。建议用于自然语言或大型自由格式文本列,适合需要精确标记查找和可扩展多词搜索的场景,而不是采用基于 Bloom filter 的近似方法。
- bloom_filter:以概率方式判断某个值是否存在于块中,从而实现针对集合成员关系的快速近似过滤。对于优化“大海捞针”式查询非常有效,即需要找到正向匹配时。
- tokenbf_v1 / ngrambf_v1: (已弃用) 专门用于在字符串中搜索标记或字符序列的 Bloom filter 变体——尤其适用于日志数据或文本搜索场景。在 ClickHouse >= 26.2 版本中已弃用,现已由文本索引取代。
- 整体基数高、但块内基数低的列。
- 对搜索至关重要的稀有值 (例如错误代码、特定 ID) 。
- 过滤发生在非主键列上且数据分布具有局部性的场景。
- 使用真实数据和贴近实际的查询来测试跳过索引。尝试不同的索引类型和粒度值。
- 使用诸如 send_logs_level=‘trace’ 和
EXPLAIN indexes=1之类的工具评估其影响,以查看索引效果。 - 始终评估索引大小以及粒度对其的影响。减小粒度通常会在一定程度上提升性能,因为这样可以过滤掉更多粒度,从而减少需要扫描的数据。不过,随着粒度变小、索引体积增大,性能也可能下降。请针对不同粒度设置测量性能和索引大小。这一点对 Bloom filter 索引尤其重要。
示例
EXPLAIN indexes = 1 所示,仍需读取绝大多数行:
ViewCount 与 CreationDate (主键) 之间存在关联,这符合预期——帖子存在的时间越长,被浏览的机会也就越多。
ALTER TABLE 命令添加索引——先添加,再将其”物化”。
ViewCount 值:
再次执行前面的查询,可以看到性能显著提升。请注意,扫描的行数减少了:
EXPLAIN indexes = 1 可用于确认已使用该索引。
ViewCount > 10,000,000 条件的匹配行的行块: