Clickhouse架构设计
Column与Field
Column和Field是Clickhouse数据最基础的映射单元。作为一款百分之百的列式存储数据库,clickhouse按列式存储数据,内存中的一列数据由一个Column对象表示。column对象分为接口和实现两个部分,在Icolumn接口对象中,定义了对数据进行各种关系运算的方法,例如插入数据的insertRangeFrom和insertFrom,用于分页的cut,以及用于过滤的filter等。而这些方法的具体实现对象则是根据数据类型不同,由相应的对象实现,例如ColumnString,ColumnArray和Columntuple等。在大多数场合,clickhouse都会以整列的方式操作数据库。如果需要操作单个数值,需要使用field对象,field对象代表一个单值。field采用了聚合设计模式,在field对象内部聚合了Null,Uint64,string,array等13种数据类型以及相应的处理。
DataType
数据的序列化和反序列化工作由datatype负责。Idatatype接口定义了许多正反序列化的方法,成对出现。涵盖常用的二进制、文本、json,csv,protobuf等。Idatatype也采用了泛化设计模式,具体方法实现逻辑由对应数据类型的实例承载,例如DataTypeString、DataTypeArray等。DataType虽然负责序列化相关工作,但它并不直接负责数据的读取,而是转由Column或Field对象获取。
Block与Block流
Clickhouse内部的数据操作时面向Block进行