ClickHouse入门、实战与进阶
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.7 稀疏索引

ClickHouse支持主键索引。它根据索引粒度(默认为8192行)对每一列数据进行划分。每个索引粒度开头的第一行称为标记行。主键索引存储了标记行对应的主键的值。对于WHERE条件下有主键的查询,主键索引的二分查找可以直接定位到对应的索引粒度,避免了全表扫描,加快了查询速度。

ClickHouse支持在任何列上创建任意数量的稀疏索引。索引值可以是任何合法的SQL表达式,而不限于索引列值本身。之所以称为稀疏索引,是因为它本质上是一个完整索引粒度的统计信息,并不记录每一行在文件中的位置。MySQL会为每行都建立B树索引,而ClickHouse不会为所有的列都建立索引,而是间隔index_granularity(默认为8192)行才建立一个索引。标记(Mark)与标记行(Mark Number)均被保存在内存中,便于查询时快速检索。稀疏索引存储在primary.idx文件中。

目前,ClickHouse支持的稀疏索引类型如下。

❑minmax:以索引粒度为单位存储指定表达式计算后的最小值和最大值;它可以帮助快速跳过不满足要求的块,并减少等价和范围查询中的I/O。

❑set(max_Rows):以索引粒度为单位存储指定表达式的distinct值集,用于快速判断等价查询是否命中块,减少数据读写性能损耗。

❑ngrambf_v1索引:根据ngram切分的布隆过滤器。ngrambf_v1按照指定的长度切割n元短语,所以切出来的短语可能是无意义的。可用于优化equals、like和in表达式的性能。ngrambf_v1索引语法如下:

ngrambf_v1(n,size_of_bloom_filter_in_bytes,number_of_hash_functions,random_seed)

参数说明如下。

●n:token长度,依据n的长度将数据切割为token短语。

●size_of_bloom_filter_in_bytes:布隆过滤器的大小。

●number_of_hash_functions:布隆过滤器中使用Hash函数的个数。

●random_seed:Hash函数的随机种子。

❑tokenbf_v1索引:与ngrambf_v1类似,但是存储的是token而不是ngram。这里的token是指由非字母和非数字的分隔符分隔得到的序列。tokenbf_v1索引语法如下:tokenbf_v1(size_of_bloom_filter_in_bytes,number_of_hash_functions,random_seed)

❑布隆过滤器索引:布隆过滤器索引的工作原理和布隆过滤器相同,与上面的短语索引的区别是,它支持的数据类型更多,有Int*、UInt*、Float*、Enum、Date、DateTime、String、FixedString、Array、LowCardinality、Nullable、UUID、Map等。对于Map数据类型,客户端可以指定是否应使用mapKeys或mapValues函数为键或值创建索引。

不过值得注意的是,ClickHouse的主键索引与MySQL等数据库的主键索引不同。它不用于重复数据删除,即使具有相同主键的行也可以同时存在于数据库中。为了达到去重的效果,需要结合使用具体的表引擎ReplaceMergeTree、CollapsingMergeTree、Versioned CollapsingMergeTree。