ClickHouse 提供了多种索引类型,每种索引都有特定的用途和加速原理。以下是 ClickHouse 中主要的索引类型及其加速原理:
1. 主键索引(Primary Key Index)
加速原理:
- 主键索引通常是基于排序的,表中的数据按照主键列进行排序。
- 由于数据是有序的,主键索引可以使用二分查找来快速定位到特定的范围,从而显著减少需要扫描的数据量。
MergeTree引擎使用的ORDER BY子句定义了主键,并生成稀疏索引来加速查询。
示例:
CREATE TABLE example_table
(
id UInt32,
value String
)
ENGINE = MergeTree()
ORDER BY id;
ClickHouse 的主键索引并不是传统意义上的二叉树索引,而是通过对数据进行排序并使用二分查找来实现的。
具体来说,当你在 ClickHouse 中创建一个使用 MergeTree 引擎的表时,并指定了主键(通过 ORDER BY 子句),ClickHouse 会按照主键对数据进行排序,并使用稀疏索引来记录每个数据块的起始位置和主键值。这样,当你执行查询时,ClickHouse 可以使用二分查找算法快速定位到目标数据块,然后在该数据块中进行进一步的搜索或过滤操作。
这种基于排序和二分查找的索引实现方式在大数据量下具有较好的查询性能和存储效率,尤其适用于范围查询和聚合操作。因此,主键索引在 ClickHouse 中是一种高效的数据访问方式。
2. 稀疏索引(Sparse Index)
加速原理:
- 稀疏索引仅在特定的行上创建索引,通常是每个数据块的开始位置。
- 使用二分查找快速定位到包含目标值的数据块,然后扫描该数据块以找到具体的行。
示例:
- 稀疏索引在
MergeTree表引擎中自动维护,不需要显式定义。
3. minmax 索引
加速原理:
minmax索引记录每个数据块中某列的最小值和最大值。- 查询时,使用这些最小值和最大值来快速排除不可能包含查询值的数据块。
示例:
ALTER TABLE example_table ADD INDEX minmax_idx value TYPE minmax GRANULARITY 1;
4. Bloom Filter 索引
加速原理:
- 布隆过滤器是一种概率型数据结构,用于快速判断一个值是否存在于集合中。
bloom_filter索引为每个数据块创建一个布隆过滤器,以便快速过滤掉不包含查询值的数据块。
示例:
ALTER TABLE example_table ADD INDEX bloom_idx value TYPE bloom_filter(0.01) GRANULARITY 4;
5. tokenbf_v1 索引
加速原理:
- 专门用于字符串列的布隆过滤器索引,可以加速包含操作(如
LIKE '%value%')。 - 它将字符串拆分为标记,并为这些标记构建布隆过滤器。
示例:
ALTER TABLE example_table ADD INDEX tokenbf_idx value TYPE tokenbf_v1(1024, 3, 0) GRANULARITY 4;
6. set 索引
加速原理:
set索引适用于低基数的列,例如布尔值或枚举类型。- 索引列的值存储在集合中,可以快速查找这些值是否存在于集合中。
示例:
ALTER TABLE example_table ADD INDEX set_idx value TYPE set(64) GRANULARITY 4;
7. ngrambf_v1 索引
加速原理:
- 用于文本搜索,将字符串分割成 n-gram 并构建布隆过滤器。
- 支持对文本字段的快速全文搜索。
示例:
ALTER TABLE example_table ADD INDEX ngrambf_idx value TYPE ngrambf_v1(3, 256, 3, 0) GRANULARITY 4;
加速原理总结
-
排序与二分查找:
- 主键索引和稀疏索引通过对数据进行排序并使用二分查找来快速定位数据块,减少扫描范围。
-
范围过滤:
minmax索引通过记录每个数据块的最小值和最大值来快速排除不可能包含查询值的数据块。
-
概率性过滤:
bloom_filter、tokenbf_v1和ngrambf_v1索引使用布隆过滤器来快速判断值是否存在于数据块中,从而减少扫描不相关数据块的概率。
-
集合过滤:
set索引通过将索引列的值存储在集合中,快速判断查询值是否在集合中,从而加速查询。
选择适当的索引类型,可以显著提高查询性能。根据具体的查询需求和数据特性来设计索引策略,是优化 ClickHouse 查询性能的关键。