ClickHouse实战处理(一):MergeTree系列引擎

MergeTree作为家族系列最基础的表引擎,主要有以下特点:

  1. 存储的数据按照主键排序:创建稀疏索引加快数据查询速度。
  2. 支持数据分区,可以通过PARTITION BY语句指定分区字段。
  3. 支持数据副本。
  4. 支持数据采样。
    总之适用于高负载任务的最通用和功能最强大的表引擎。可以快速插入数据并进行后续的
    后台数据处理。支持数据复制(使用Replicated* 的引擎版本)、分区和其他引擎不支持
    的特性

MergeTree系列表引擎包含:
MergeTree:
ReplacingMergeTree、
ReplicatedMergeTree(复制表):
SummingMergeTree(汇总求和功能):四、SummingMergeTree
SummingMergeTree(聚合功能): 五、AggregatingMergeTree
CollapsingMergeTree(折叠删除功能)、
GraphiteMergeTree、
VersionedCollapsingMergeTree(版本折叠功能)、
在这些的基础上还可以叠加Replicated和Distributed。

一、MergeTree

1、MergeTree建表参数

MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段在磁盘上不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来。

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, ...]
​关于以上建表语句的解释如下:

1、ENGINE:ENGINE = MergeTree(),MergeTree引擎没有参数。

2、ORDER BY:排序字段。比如ORDER BY (Col1, Col2),值得注意的是,如果没有使用 PRIMARY KEY 显式的指定主键ORDER BY排序字段自动作为主键。如果不需要排序,则可以使用 ORDER BY tuple() 语法,这样的话,创建的表也就不包含主键。这种情况下,ClickHouse会按照插入的顺序存储数据。必选项。

3、PARTITION BY:分区字段,例如要按月分区,可以使用表达式 toYYYYMM(date_column),这里的date_column是一个Date类型的列,分区名的格式会是"YYYYMM"。可选。

4、PRIMARY KEY:指定主键,如果排序字段与主键不一致,可以单独指定主键字段。否则默认主键是排序字段。大部分情况下不需要再专门指定一个 PRIMARY KEY 子句,注意,在MergeTree中主键并不用于去重,而是用于索引,加快查询速度。可选。

另外,如果指定了PRIMARY KEY与排序字段不一致,否则报错。要保证PRIMARY KEY 指定的主键是ORDER BY 指定字段的前缀,这样主键仍然是排序键的前缀,不会出现索引与数据顺序混乱的问题。
比如: 
.......
ORDER BY (A,B,C)
PRIMARY KEY A 

5、SAMPLE BY:采样字段,如果指定了该字段,那么主键中也必须包含该字段。比如 SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。可选。

6、TTL:数据的存活时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这一列的数据;如果是表级别的TTL,则会删除整张表的数据。
1)表级别TTL:
设置TTL的表,必须包含Date或DateTime类型的字段。 TTL子句不能用于key列。 表级别TTL也可以指定在磁盘和卷之间自动移动数据的逻辑。

表达式:TTL expr [DELETE|TO DISK 'aaa'|TO VOLUME 'bbb'], .. 
CREATE TABLE example_table 
(d DateTime,
 a Int)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH [DELETE],
 d + INTERVAL 1 WEEK TO VOLUME 'aaa',
 d + INTERVAL 2 WEEK TO DISK 'bbb';
SETTINGS storage_policy ='moving_from_ssd_to_hdd'; 

2)列级别TTL:  
--定义列数据的生命周期, 需要在这个日期字段使用操作符:
TTL time_column + interval 1 HOUR

7、SETTINGS:额外的参数配置。可选。

数据删除说明:

  1. 当ClickHouse合并数据片段时, 将删除TTL过期的数据。
  2. 当ClickHouse发现数据过期时, 它将执行一个计划外的合并。 要控制这类合并的频率, 可设置参数merge_with_ttl_timeout。如果该值设置的过低, 它将导致执行许多的计划外合并,这可能会消耗大量资源。
  3. 如果在合并的时候执行SELECT查询, 则可能会得到过期的数据。 为了避免这种情况, 可以在SELECT之前使用OPTIMIZE查询。

2、分区表以及分区目录的合并过程

2.1、创建分区表


1. 分区是在建表时使用PARTITION BY expr子句指定。
2. 分区键可以是表列中的任何表达式。
 例如,按月指定分区:PARTITION BY toYYYYMM(da

你可能感兴趣的:(clickhouse,数据库,大数据)