ClickHouse核心模块--Column&Field
- • Column与Field是ClickHouse数据最基础的映射单元
- • 内存中的每一列数据由一个Column对象表示。Column对象分为接口和实现两部分,在IColunn接口对象中,定义了对数据进行各种关系运算的方法
- • 在大多数场合,ClickHouse都会以整列的方式操作数据。如果需要操作单个具体的数值,则需要使用Field对象,Field对象代表一个单值。与Column对象的泛化设计思路不同,Field对象使用了聚合的设计模式。
- • 在Field对象内部聚合了Null、UInt64、String和Array等13种数据类型及相应的处理逻辑。
ClickHouse核心模块--DataType&Block
- • 数据的序列化核反序列化工作由DataType负责。IDataType接口定义了许多正反序列化的方式,它们成对出现
- • ClickHouse内部的数据操作是面向Block对象进行的,并且采用流的形式
- • Block对象可以看作数据表的子集。Block对象是由Column、DataType及列名称组成的三元组,仅通过Block对象能完成一系列的数据操作
- • Block流操作有两组顶层接口,IBlockInputStream负责数据的读取和关系运算;IBlockOutputStream负责将数据输出到下一环节。IBlockInputStream接口有众多实现类,这些实现类大致可以分为三类,第一类用于处理数据定义的DDL操作;第二类用于处理关系运算的各种操作;第三类是与表引擎呼应,每一种表引擎都拥有与之对应的。
ClickHouse核心模块--Parser&Interpreter
- • Parser分析器可以将一条SQL语句以递归下降的方式解析成AST语法树的形式。不同的SQL语句,会经由不同的Parser实现类解析
- • Interpreter解释器负责解释AST,并进一步创建查询的执行Processor,起到串联整个查询过程的作用,它会根据解释器的类型,聚合它所需要的资源
ClickHouse核心模块--Functions&Aggregate Functions
- • ClickHouse主要提供两类函数,普通函数核聚合函数
- • 普通函数由IFunction接口定义,拥有数十钟函数实现,普通函数是没有状态的,而是采用向量化的方式直接作用于一整列数据
- • 聚合函数由AggregateFunction接口定义,聚合函数是有状态的,以COUNT聚合函数为例,其AggregateFunctionCount的状态使用整型Unit64记录,聚合函数的状态支持序列化核反序列化。所以能够在分布式节点之间进行传输,以实现增量计算。
MergeTree表引擎家族
- • PARTITION BY 选填,分区键
- • ORDER BY 必填,排序键
- • PRIMARY KEY 选填,表示主键,声明之后会依次按照主键字段生成一级索引,用于加速表查询。如果不指定,那么主键默认和排序键相同。MergeTree允许主键有重复数据
- • SAMPLE KEY 选填,抽样表达式。用于声明数据以何种标准进行采样,其用于配合SAMPLE子查询使用
- • INDEX 选填,二级索引,也叫做跳数索引
- • SETTINGS 选填,用于指定一些额外的参数,例index_granularity(索引粒度),min_compress_block_size(最小的压缩数据块大小)
MergeTree存储结构
- • columns.txt
列信息文件,使用文本文件存储,用于保存分区下的列字段信息
- • primay.idx
索引文件,用于存储稀疏索引
- • [column].bin
数据文件,使用压缩格式存储,默认使用LZ4压缩格式,用于存储某一列数据
- • [column].mrk
列字段标记,保存了bin文件中的数据偏移量信息,MergeTree通过标记文件建立了primay.idx稀疏索引与bin数据文件的映射关系
- • [column].mrk2
如果用了自适应大小的索引间隔,则标记文件会以.mrk2命名
- • partition.dat
用于保存当前分区表达式最终生成值
- • minmax_[column].idx
用于记录当前分区字段对应原始数据的最小值和最大值
- • skip_idx_[column]