MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来。
MergeTree作为家族系列最基础的表引擎,主要有以下特点:
* 存储的数据按照主键排序:允许创建稀疏索引,从而加快数据查询速度
* 支持分区,可以通过PRIMARY KEY语句指定分区字段。
* 支持数据副本
* 支持数据采样
建表语法:
~~~
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, ...]
~~~
* ENGINE:ENGINE = MergeTree(),MergeTree引擎没有参数
* ORDER BY:排序字段。比如ORDER BY (Col1, Col2),值得注意的是,如果没有指定主键,默认情况下 sorting key(排序字段)即为主键。如果不需要排序,则可以使用ORDER BY tuple()语法,这样的话,创建的表也就不包含主键。这种情况下,ClickHouse会按照插入的顺序存储数据。必选。
* PARTITION BY:分区字段,强烈建议指定。
* PRIMARY KEY:指定主键,如果排序字段与主键不一致,可以单独指定主键字段。否则默认主键是排序字段。可选。
* SAMPLE BY:采样字段,如果指定了该字段,那么主键中也必须包含该字段。比如SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。可选。
* TTL:数据的存活时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这一列的数据;如果是表级别的TTL,则会删除整张表的数据。大表强烈建议指定。
* SETTINGS:额外的参数配置。一般设置index\_granularity=8192 ,可选。
- 导读
- 概述
- 第一章 安装部署
- 1.1. docker安装clickhouse
- 第二章 使用实践与规范
- 2.1. ClickHouse应用场景
- 2.2. 表引擎选择
- 2.2.1. MergeTree表引擎
- 2.2.2. ReplicatedMergeTree表引擎
- 2.2.3. ReplacingMergeTree表引擎
- 2.2.4. SummingMergeTree表引擎
- 2.2.5. Aggregatingmergetree表引擎
- 2.3. 开发规范
- 2.4. 集群架构
- 2.4.1. 常用架构
- 2.4.2. zookeeper的关键作用
- 2.4.3. chproxy
- 2.5. 客户端工具选择
- 2.6. 可用性说明
- 2.7. 集群配置参数调优
- 第三章 数据类型&语法以及常用函数
- 3.1. 基础数据类型
- 3.2. SQL函数
- 3.3. DDL与DML基本语法
- 3.4. UPDATE 和 DELETE操作
- 3.4.1. 数据UPDATE和DELETE操作示例
- 3.4.2. 数据的实时更新操作(Real-time UPDATE)
- 第四章 clickhouse实战篇
- 4.1. JDBC操作clickhouse
- 4.2. clickhouse集成mybatis