Clickhouse支持的跳数/稀疏索引(Data Skipping Indexes)介绍

当前的Clickhosue版本(ClickHouse release 21.6, 2021-06-05)支持5种跳数、稀疏索引(Data Skipping Indexes),本文介绍其使用方法。

跳数/稀疏索引语法

在建表语句的create部分,指定跳数索引(Data Skipping Indexes),如有多个则用逗号分割。

INDEX index_name expr TYPE type(...) GRANULARITY granularity_value
  • index_name : 跳数索引的名字
  • expr : 计算表达式,用于索引。
  • type(...) : 跳数索引类型
  • granularity_value : 粒度大小,单位是引擎参数index_granularity 。比如大小为3,则是指3个index_granularity 数据。粒度越大,跳过大片【不满足】要求的数据的效果越好,但如果太大,导致大部分都【满足】,则跳过效果较少,索引就失去效果了。

跳数/稀疏索引类型

minmax

报错的最大最小值(极值)。如下例子是2个列相乘,记录其minmax值的跳数索引。

INDEX a (u64 * i32, s) TYPE minmax GRANULARITY 3,

适合场景

SELECT count() FROM table WHERE u64 * i32 == 10

set(max_rows)

一组数量有限的(max_rows)的唯一数结果集。如下是一个字段和另一个字段长度的乘积。 最多有1000个不重复值。

INDEX b (u64 * length(s)) TYPE set(1000) GRANULARITY 4

适合场景

SELECT count() FROM table WHERE u64 * length(s) >= 1234

根据ngram切分的布隆过滤器。可用于优化 equals , like 和 in 表达式的性能。

ngrambf_v1(n, size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)

  • n – 短语长度。
  • size_of_bloom_filter_in_bytes – 布隆过滤器大小,单位字节。(因为压缩得好,可以指定比较大的值,如 256 或 512)。
  • number_of_hash_functions – 布隆过滤器中使用的哈希函数的个数。
  • random_seed – 哈希函数的随机种子

样例

INDEX index_name (ID, Code) TYPE ngrambf_v1(3, 256, 2, 0) GRANULARITY 5;
-- 3: token 长度,把数据切割成长度为 3 的短语
-- 256: 布隆过滤器大小
-- 2: 哈希函数个数
-- 0: 哈希函数随机种子

适合场景

where code like  '%123%'

tokenbf_v1(size_of_bloom_filter_in_bytes, number_of_hash_functions, random_seed)

与ngrambf_v1一样,不同于 ngrams 存储字符串指定长度的所有片段。它只存储被非字母数字字符分割的片段。

INDEX d ID TYPE tokenbf_v1(256, 2, 0) GRANULARITY 5