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表引擎专为大量插入数据的场景而设计,它将
主键
- 不具有唯一约束,可以重复
- 使用稀疏索引,索引粒度(index granularity)指定设置索引的间隔,MergeTree默认为8192。官方不建议修改索引粒度,除非该主键存在大量重复元素。
order by
建表DDL的必选项,规定分区内数据按照哪些字段进行排序。order by字段列必须以主键为前缀。
二级索引
在一级索引粒度的基础再划分的粒度。
TTL
设置数据过期时间,过期后动作:
- 删除
- disk
- volume
ReplacingMergeTree
MergeTree的一个变种,存储特性完全继承自MergeTree,只是多了一个去重功能:
- 去重只会在合并过程中实现;
- 去重范围:分区内部,不能跨分区;
因此去重只是在后台清除重复数据来节省空间,但是不保证完全没有重复数据出现。
建表语句指定去重标识字段,以该字段的最大值作为保留记录,最大值存在多条记录则按照插入顺序只保留最晚插入的记录。
SummingMergeTree
在分区内对指定字段进行聚合操作,
- 写sql还是要加上sum,可能还没发生合并