Clickhouse为什么有这么高的性能

一、 架构设计
1、 MPP架构(海量数据并行处理架构),share nothing模式,每个节点访问自己的cpu、内存、磁盘,且与节点之间的数据访问并行。
2、 向量执行引擎,从寄存器硬件层面优化,采用数据并行,速度提升指数级别。采用cpu缓存作为临时交换数据,速度比内存交换数据还要快。
3、 列式存储和数据压缩
4、 支持sql查询,采用关系型模型描述数据
5、 支持表引擎,将数据存储抽象成独立的接口,根据实际应用场景,选择适合的表引擎。
6、 多线程和并发处理数据,线程级别并行处理数据,横向上将表分片(即分成多节点),纵向上将表进行分区。
7、 多主架构,每个节点角色对等,客户端访问任一节点都能得到相同的效果
8、 支持实时查询
9、 支持分布式查询,支持分片,采用分治思想,横向切分,分片依赖于集群,分片的数量取决于集群节点数。Clickhouse提供本地表和分布式表,分布式表不存储数据,是本地表的访问代理,一张本地表就是一份数据分片。
10、 架构设计
在这里插入图片描述

1) Column和Field是ClickHouse数据最基础的映射单元。ClickHouse按列存储数据,内存中的一列数据由一个Column对象表示。在大多数情况下,ClickHouse都会以整列的方式操作数据,但如果需要操作某列中单个具体的数值,就需要使用Field对象,Field对象代表一个单值。

Column对象采用泛化设计思路,对象分为接口和实现两个部分。接口定义了对数据进行各种关系运算的方法;而这些方法的具体实现,根据数据类型的不同,由相应的对象实现。

Field对象使用了聚合的设计模式,在Field对象内部聚合了Null、UInt64、String和Array等多种数据类型和对应的处理逻辑。
2) 数据的序列化和反序列化工作由DataType负责,虽然DataType负责序列化相关工作,但DataType并不直接负责数据的读取,而是转由从Column或者Field对象获取数据。

虽然Column和Field组成了数据的基本映射单元,但在实际操作中还缺少一些必要信息,如数据的类型和列的名称,于是ClickHouse设计了Block对象,ClickHouse内部的数据操作是面向Block对象进行的,Block对象可以看作是数据表的子集。

Block对象的本质是由数据对象(Column)、数据类型(DataType)和列名称(列名称字符串)组成的三元组。Column提供了数据的读取能力,DataType提供了序列化和反序列化,Block在这些对象的基础上实现了进一步的抽象和封装,从而简化了整个使用的过程,仅通过Block对象就能完成一系列的数据操作。
3) ClickHouse主要提供两类函数:普通函数和聚合函数。

普通函数由IFunction接口定义,内部有很多函数的实现,如FunctionFormatDateTime,FunctionSubstring等。普通函数是没有状态的,函数效果作用于每行数据之上,在函数执行过程中,并不会逐行计算,而是采用向量化的方式直接作用与一整列数据。

聚合函数由IAggregateFunction接口定义,聚合函数是有状态的。聚合函数的状态支持序列化与反序列化,所以能够在分布式节点之间进行传输,从而实现增量计算。
4) ClickHouse在数据表的底层设计中并没有所谓的Table对象,它直接使用IStorage接口指代数据表。

表引擎是ClickHouse的一个显著特性,不同的表引擎由不同的子类实现,例如IStorageSystemOneBlock(系统表引擎),StorageMergeTree(合并树表引擎)和StorageTinyLog(日志表引擎)等。

IStorage接口定义了DDL(如alter、rename、drop等)、read和write方法,分别负责数据的定义、查询与写入。在数据查询时,IStorage负责根据AST(抽象语法树)查询语句的要求,返回指定列的原始数据。
5) Parser和Intercepter是非常重要的两组接口。Parser分析器负责创建AST对象;Intercepter解释器负责解释AST,并进一步创建查询的执行管道。它们与IStorage一起串联了整个数据查询过程。
(1)Parser分析器可以将一条SQL语句解析成AST语法树的形式,不同的SQL语句,会由不同的Parser实现类解析。
(2)Intercepter解释器对AST进行解释,然后创建查询的执行通道。
(3)IStorage负责根据AST查询语句的指示要求,返回指定列的原始数据。
通过Block对象完成一系列的数据操作。
6) 服务器实现了多个不同的接口:
(1)一个用于任何外部客户端的 HTTP 接口。
(2)一个用于本机 ClickHouse 客户端以及在分布式查询执行中跨服务器通信的 TCP 接口。
(3)一个用于传输数据以进行拷贝的接口。
二、 高性能秘诀
1、 硬件层面,数据结构优化
2、 算法是重中之重,比如根据不同的数据规模选择不同的数据结构
3、 具体问题具体分析,不同的应用场景选择不同的实现方式

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值