概述
Clickhouse 中最强大的表引擎当属 MergeTree
(合并树)引擎及该系列(MergeTree
)中的其他引擎。MergeTree
系列的引擎被设计用于插入极大量的数据到一张表当中,数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多,主要特点:
- 存储的数据按主键排序,这使得您能够创建一个小型的稀疏索引来加快数据检索;
- 如果指定了分区键的话,可以使用分区,在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能;
- 支持数据副本,
ReplicatedMergeTree
系列的表提供了数据副本功能; - 支持数据采样,需要的话,您可以给表设置一个采样方法。
MergeTree表创建
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, ...]
PARTITON BY
:选填,表示分区键,用于指定表数据以何种标准进行分区。分区键既可以是单个字段,也可以通过元组的形式指定多个字段,同时也支持使用列表达式。如果不支持分区键,那么 ClickHouse 会生成一个名称为 all 的分区,合理地使用分区可以有效的减少查询时数据量;ORDER BY
:必填,表示排序键,用于指定在一个分区内,数据以何种标准进行排序。排序键既可以是单个字段,例如 ORDER BY CounterID,也可以是通过元组声明的多个字段,例如 ORDER BY (CounterID, EventDate)。如果是多个字段,那么会先按照第一个字段排序,如果第一个字段中有相同的值,那么再按照第二个字段排序,依次类推。总之在每个分区内,数据是按照分区键排好序的,但多个分区之间就没有这种关系了;PRIMARY KEY
:选填,表示主键,声明之后会依次按照主键字段生成一级索引,用于加速表查询,如果不指定,那么主键默认和排序键相同,所以通常直接使用 ORDER BY 代为指定主键,无须使用 PRIMARY KEY 声明。一般情况下,在每个分区内,数据与一级索引以相同的规则升序排列。和其它关系型数据库不同,MergeTree 允许主键有重复数据,也可以通过 ReplacingMergeTree 实现去重;SAMPLE KEY
:选填,抽样表达式。用于声明数据以何种标准进行采样,注意:如果声明了此配置项,那么主键的配置中也要声明同样的表达式;
......
) ENGINE = MergeTree()
ORDER BY (CountID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID)
-- 抽样表达式需要配合 SAMPLE 子查询使用,该功能对选取抽样数据十分有用
- SETTINGS:选填,用于指定一些额外