ClickHouse跳数索引解读
在ClickHouse稀疏索引原理解读文章中,我们通过设置合理的稀疏主键索引,极大地优化了通用场景下的查询性能。然而,我们也发现,当我们想通过别的列(标签)进行过滤时,由于未能命中稀疏索引,就变成了全表扫描。 例如,对于cpu_ts表,当我们要通过别的维度,例如hostname,进行查询分析时,ClickHouse会对hostname列的所有值进行全表扫描,再根据WHERE中的条件对值进行过滤。 在传统的关系型数据库中,我们可以通过创建一个或多个的二级索引(B+树实现)来加快查询效率。而ClickHouse中也同样提供了一种类似的方式,不过由于ClickHouse是纯列式存储,磁盘上并没有单独的行数据,因此没法利用二级索引来构建面向行的索引。 因此ClickHouse通过一种被称为跳数索引的索引机制来达到传统二级索引的效果,之所以叫跳数,是因为数据的定位是通过跳过那些肯定不满足过滤条件的数据块来实现的。 通过hostname进行查询 添加跳数索引前 在cpu_ts表中,hostname字段每1024行就会重新生产一份随机字符串用来模拟实际场景。这里我们使用如下SQL查询主机fa9c19a5-39eb-4bea-97df-5a6b82e5e947的CPU使用率: select ts, avg(usage_user) from cpu_ts where hostname = 'fa9c19a5-39eb-4bea-97df-5a6b82e5e947' group by toStartOfMinute(timestamp) as ts order by ts; 结果如下: Query id: e34e54e8-8c9f-4f5b-ba29-83f54a095167 ┌──────────────────ts─┬───avg(usage_user)─┐ │ 2022-01-15 07:24:00 │ 77.7843137254902 │ │ 2022-01-15 07:25:00 │ 75.23333333333333 │ │ 2022-01-15 07:26:00 │ 73.96666666666667 │ │ 2022-01-15 07:27:00 │ 79.7 │ │ 2022-01-15 07:28:00 │ 77.68333333333334 │ │ 2022-01-15 07:29:00 │ 73.03333333333333 │ │ 2022-01-15 07:30:00 │ 72.21666666666667 │ │ 2022-01-15 07:31:00 │ 75....