一、MergeTree
1、创建与存储
- MergeTree 在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。
- 为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段被合成一个新的片段。
- 这些数据片段不断合并的特点,也正是合并树名称的由来。
1.1 创建方式
语法:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...]
[SETTINGS name=value, ...]
配置选项:
- ORDER BY [必填]:排序键,用于指定在一个数据片段内,数据以何种标准排序。
- 如果没使用 PARTITION BY 指定主键,默认会使用排序键作为主键。
- 排序键设置单列,ORDER BY xxx。排序键设置多列,ORDER BY (xxx, yyy)。
- PARTITION BY [选填]:分区键,用于指定表数据以何种标准进行分区。
- 如果不声明分区键,则ClickHouse会生成一个名为 all 的分区。
- PRIMARY KEY [选填]:主键,声明后会依据主键字段生成一级索引,用于加速表查询。
- 默认情况下,主键与排序键相同。
- 在一般情况下,在单个数据片段内,数据与一级索引以相同的规则生序排列。
- 与其他数据库不同,MergeTree 主键允许存在重复数据(ReplacingMergeTree可以去重)。
- SAMPLE BY [选填]:抽样表达式,用于声明数据以何种标准进行采样。
- 如果使用抽样表达式,主键中必须包含这个表达式。
- 例如:
ENGINE = MergeTree() ORDER BY (a, b, intHash32(UserID) SAMPLE BY intHash32(UserID)
- TTL [选填]:指定列的存储周期或定义数据片段在硬盘和卷上的移动逻辑的规则列表。
- 表达式中必须存在至少一个 Date 或 DateTime 类型的列,比如:
TTL date + INTERVAl 1 DAY
- DELETE 是当指定列到达指定时间后删除过期的数据。默认的规则是 DELETE。
- TO DISK ‘xxx’|TO VOL
- 表达式中必须存在至少一个 Date 或 DateTime 类型的列,比如: