关于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会提供归并再分解的功能来解决乱序。
浙公网安备 33010602011771号