> 文章列表 > clickhouse跳表索引最佳实践--minmax索引+Set索引

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

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

背景

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

跳表索引

我们先大概改下几种不同类型的跳表索引的数据结构:
在这里插入图片描述
下面我们就来介绍下每种不同类型的跳表索引:
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条记录)的数据块就只能都读取到内存中查找了

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

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