每个部分都提供了基于样本数据的示例,并演示了如何在查询执行过程中验证索引是否被使用。
MinMax 索引
minmax 索引最适合用于松散排序的数据上的范围谓词,或用于与 ORDER BY 相关联的列。
EXPLAIN 和剪枝的完整示例。
Set 索引
set 索引;如果每个块中包含大量不同值,则效果不大。
用于全文检索的 Text index (text)
text 是一种基于分词文本数据的倒排索引。
它专为全文检索工作负载设计,可高效、确定性地进行标记和术语查找。
推荐用于自然语言或大规模文本检索场景。
更多详细信息和示例,请参阅使用 Text Indexes 进行全文检索。
通用 布隆过滤器 (标量)
bloom_filter 索引适用于“大海捞针”式的等值/IN 成员匹配。它接受一个可选参数,即假阳性率 (默认值为 0.025) 。
用于子串搜索的 N-gram 布隆过滤器 (ngrambf_v1) (已弃用)
在 ClickHouse
>= 26.2 版本中,使用 ngrambf_v1 索引进行全文搜索已弃用,建议改用 text 索引 (更多详情请参见此处) 。ngrambf_v1 索引会将字符串拆分为 n-grams。它非常适合 LIKE '%...%' 查询。它支持 String/FixedString/Map (通过 mapKeys/mapValues) ,并支持调节大小、哈希数量和 seed。更多详情请参见 N-gram 布隆过滤器 文档。
用于基于单词搜索的标记布隆过滤器 (tokenbf_v1) (已弃用)
在 ClickHouse 版本
>= 26.2 中,使用 tokenbf_v1 索引进行全文搜索已被弃用,建议改用 text 索引 (更多详情请参见此处) 。tokenbf_v1 会为由非字母数字字符分隔的标记建立索引。你应将其与 hasToken、LIKE 单词模式或等值比较/IN 搭配使用。它支持 String/FixedString/Map 类型。
更多详情请参见标记布隆过滤器和布隆过滤器类型页面。
在 CREATE TABLE 时添加索引 (多个示例)
Map/Tuple/Nested 类型,下面的示例对此进行了演示:
对现有数据分区片段进行物化并验证
MATERIALIZE 为现有数据分区片段添加索引,并通过 EXPLAIN 或跟踪日志查看剪枝效果,如下所示:
何时使用及何时避免使用跳过索引
- 过滤值在数据块内分布稀疏
- 与
ORDER BY列存在较强相关性,或者数据摄取模式会将相似值聚集在一起 - 在大型日志数据集中执行文本搜索 (
ngrambf_v1/tokenbf_v1类型)
- 大多数数据块很可能至少包含一个匹配值 (无论如何都会读取这些块)
- 对与数据排序无相关性的高基数列进行过滤
重要注意事项如果某个值在一个数据块中哪怕只出现一次,ClickHouse 也必须读取整个块。请使用真实数据集测试索引,并根据实际性能测量结果调整粒度和特定类型的参数。
临时忽略或强制使用索引
ignore_data_skipping_indices。
注意事项和限制
- 跳过索引仅支持用于 MergeTree 家族表;剪枝发生在粒度/块层级。
- 基于布隆过滤器的索引具有概率性 (误报会导致额外读取,但不会跳过有效数据) 。
- 布隆过滤器和其他跳过索引应使用
EXPLAIN和 tracing 进行验证;调整粒度,以在剪枝效果与索引大小之间取得平衡。