Skip to main content

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,
...
PROJECTION projection_name_1 (SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY]),
PROJECTION projection_name_2 (SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY])
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr
[DELETE|TO DISK 'xxx'|TO VOLUME 'xxx' [, ...] ]
[WHERE conditions]
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ]
[SETTINGS name=value, ...]

说明

  • ENGINE:指定引擎类型和引擎参数,MergeTree引擎没有参数
  • ORDER BY:指定排序字段(必填项❗),若未指定主键,ClickHouse使用排序字段作为主键,不需要排序写成ORDER BY tuple()
  • PARTITION BY:指定分区字段。大多数场景不需要设置分区字段,有的话分区粒度至少为月。和排序字段不同,分区字段不会加快查询速度。如果按月分区,使用toYYYYMM(date_column),其中字段date_column是Date类型;
  • PRIMARY KEY:指定主键,默认情况下排序字段即主键,尽量不要单独设置主键;
  • SAMPLE BY:指定抽样字段,必须是主键的一部分;
  • TTL

MergeTree

MergeTree表引擎专为大量插入数据的场景而设计,它将

主键

  1. 不具有唯一约束,可以重复
  2. 使用稀疏索引,索引粒度(index granularity)指定设置索引的间隔,MergeTree默认为8192。官方不建议修改索引粒度,除非该主键存在大量重复元素。

order by

建表DDL的必选项,规定分区内数据按照哪些字段进行排序。order by字段列必须以主键为前缀。

二级索引

在一级索引粒度的基础再划分的粒度。

TTL

设置数据过期时间,过期后动作:

  1. 删除
  2. disk
  3. volume

ReplacingMergeTree

MergeTree的一个变种,存储特性完全继承自MergeTree,只是多了一个去重功能:

  1. 去重只会在合并过程中实现;
  2. 去重范围:分区内部,不能跨分区;

因此去重只是在后台清除重复数据来节省空间,但是不保证完全没有重复数据出现。

建表语句指定去重标识字段,以该字段的最大值作为保留记录,最大值存在多条记录则按照插入顺序只保留最晚插入的记录。

SummingMergeTree

在分区内对指定字段进行聚合操作,

  1. 写sql还是要加上sum,可能还没发生合并