关于hologres的segmentKey和ClusteringKey

hologres的数据有四种索引,分别是分区,分布,segmentKey,ClusteringKey

每命中一个都可以提高查询效率。

segmentKey和ClusteringKey的区别是什么呢?

ClusteringKey是文件内排序。而segmentKey是文件之间归并的排序。segmentKey一般是时间戳,与数据的写入时间有强关联关系

举个例子

有份数据是乱序写入的,数据如下

时间戳 age

1 4

2 5   

4 6

3 9

5 3

8 1

6 8

7 1

9 7

假设一份文件只能存三行数据,则

存在3份文件,因为是顺序写入,所以是

1 4

2 5   

4 6

-------

3 9

5 3

8 1

-------

6 8

7 1

9 7

但是此时我们将age设置成ClusteringKey,我们的数据存储就变成了下面这样

1 4

2 5   

4 6

-------

8 1

5 3

3 9

-------

7 1

9 7

6 8

即每份文件内部按照age进行了排序,如果你使用age做过滤的话,是可以在文件内命中索引的。

那么segmentKey是什么作用呢?

我们发现第一份数据的时间戳是1-4,第二份3-8,第三份6-9.

如果你使用时间戳过滤的话,比如 时间戳>5,那么第一份文件就不会命中,直接查询第二份文件和第三份文件,也就是命中了segment索引。

------------------------------------------------------------------------------------------------------------------------

另外,因为顺序写入的数据会产生归并。归并也会按照segment key进行。比如第一份文件会先和第二份文件归并,而不会和第三份文件归并。

第二份和第二份文件归并后,就产生了新的1-8的文件。

乱序对segment key发挥的过滤优化有干扰作用,因为会产生文件之间的overlap(数据范围重叠)。

所以尽量使用不会产生overlap的字段来设置为segment key

就是说,当该文件顺序写入的时候,segment key也基本是顺序的。

当然不建议使用数据写入时间作为segment key,因为基本没有人会用写入时间作为查询条件。

目前还没了解到,hologres会提供归并再分解的功能来解决乱序。

posted @ 2021-10-20 21:56  肥仔佳文猪  阅读(374)  评论(0)    收藏  举报