clickhouse基础概念

Posted by KANG's BLOG on Friday, January 19, 2024

Clickhouse特点

Clickhouse(后面简称ck)主要用于在线分析处理查询,得益于优秀的设计,成为OLAP领域的佼佼者。

下面就来看看它具体采用了哪些设计来达到高性能的实时分析能力。

对于数据库来说,高性能的核心问题就是并行处理和减少磁盘IO,所以ck采用了MPP架构,底层数据基于列式存储。

MPP

大规模并行处理架构,是share nothing类型的,特点是每个计算单元内所有的资源完全独立,包括CPU、内存、硬盘、甚至操作系统,节点间数据完全隔离,仅靠网络进行通信。

计算时各个节点单独计算,最后汇总后进行整理。所以上层用户使用时,MPP架构可以被视作整体。

share nothing的流行,也是因为随着时代发展,硬件层级能够带来万兆带宽和RDMA技术的支撑。

列式存储

行式存储和列式存储各有优劣:

行式存储优点时每条数据的所有内容存储在一起,适合频繁插入更新。

列式存储则是同属性数据存储在一起,适合压缩和数据分析。一条完整的数据散落在不同的列中,插入、更新慢,但是天然适合分布式。

毫无疑问,列式存储更适合大数据量的在线分析。

ck最小的处理单元是block,每个block存储的就是一段列数据,默认最大为8192行,ck采取LZ4压缩,大约可以做到8:1的压缩比。

索引的设计

ck的一级索引为稀疏索引,其只记录每个block的第一个元素,所以存储量小,可以全部放内存里。

二级索引为跳数索引,简单的说,就是在block之上建立一层索引,在将多个block划分到一个二级索引上,通过索引表述的数据特征,来让搜索时快速分别是否可以跳过该二级索引范围下的这些block。

不同类型的二级索引的特征描述方式不同,比如set类型用来存储大量重复值的索引,minmax类型用来标记数据范围,布隆过滤器来快速甄别数据是否不存在。

向量化计算

向量化计算就是利用多核CPU的特性,让for循环的多次计算变成一次计算,原理是利用CPU的寄存器层面实现并行操作。ck利用SSE4.2指令集实现向量化计算。

查询并发

为了快速查询的目的,ck每次查询都会使用一半核数的cpu,这样极大提高了并行处理能力。

但是相对的,这种设计带来的副作用是高并发查询能力的下降。

所以ck的适合的查询场景是快速低并发。