clickhouse跳表索引最佳实践--minmax索引+Set索引

背景

我们知道对于clickhouse这种列式存储数据库来说,它虽然也提供了与mysql的btree的二级索引类似的跳表索引的功能,但是其实跳表索引和btree的二级索引有根本上的不同,比如mysql的二级索引一般来说应用于高基数的列的效果是最佳的,但是对于各种类型的跳表索引来说,高基数的列很不适合用来构建跳表索引

跳表索引

我们先大概改下几种不同类型的跳表索引的数据结构:
clickhouse跳表索引最佳实践--minmax索引+Set索引_第1张图片
下面我们就来介绍下每种不同类型的跳表索引:
1.minmax跳表索引类型:这是保存每个索引块(8192gradularities条记录)中最大值和最小值的元祖构成的索引类型,主要用途用于根据范围值查找记录(比如 val > 100 and val < 200)等,因为他可以根据100和200判断出来某个索引块是否包含要查找的记录,这样就可以过滤掉那些不满足条件的索引块
2.Set索引类型:这是保存每个索引块(8192
gradularities条记录)中不重复的值的索引类型,主要用途比如保存类似于日志级别的列,大部分索引块中保存的日志级别都是INFO级别,所以当查找WARN或者ERROR级别的日志时就可以跳过大部分的INFO级别的索引块,对查找WARN或者ERROR级别的日志性能极好,不过如果你查找INFO级别的列的话,这个跳表索引由于大部分都是INFO的索引块,所以查找性能不好,比全列扫描都差。 备注: Set索引类型里面有一个max_size参数,表示如果某个索引块中唯一的value的数量大于max_size,那么这个索引块就不保存对应的8192gradularities条记录中唯一值,到时候查找的时候对于这些(8192gradularities条记录)的数据块就只能都读取到内存中查找了

其实无论是minmax索引还是Set索引,我们从这个索引的存储结构中得到如下的结论:gradularities个数据块内的记录如果聚在一起,比如对于minmax索引来说,这几个数据块内的数值范围比较接近,而对于Set索引来说,这几个数据块内的元素值只有少数的几个唯一值的话,跳数索引是可以过滤更多的其他索引块的记录的,而这个数据块的数据记录如何排列又和我们的主键/排序键的定义有关.所以选择不同的主键/排序键会影响跳数索引的效率

参考文献:
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#functions-support

https://clickhouse.com/docs/en/optimize/sparse-primary-indexes#related-content

你可能感兴趣的:(clickhouse,clickhouse,mysql,数据库)