进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!
个人主页:含各种IT体系技术,IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客
订阅:拥抱独家专题,你的订阅将点燃我的创作热情!
点赞:赞同优秀创作,你的点赞是对我创作最大的认可!
⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!
✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!
目录
1. MergeTree
2. MergeTree建表语句
3. 示例一
4. 示例二
在所有的表引擎中,最为核心的当属MergeTree系列表引擎,这些表引擎拥有最为强大的性能和最广泛的使用场合。对于非MergeTree系列的其他引擎而言,主要用于特殊用途,场景相对有限。而MergeTree系列表引擎是官方主推的存储引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,支持几乎所有ClickHouse核心功能。
MergeTree系列表引擎包含:MergeTree、ReplacingMergeTree、SummingMergeTree(汇总求和功能)、AggregatingMergeTree(聚合功能)、CollapsingMergeTree(折叠删除功能)、VersionedCollapsingMergeTree(版本折叠功能)引擎,在这些的基础上还可以叠加Replicated和Distributed。
MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段在磁盘上不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。这种数据片段往复合并的特点,也正是合并树名称的由来。
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, ...]
另外,如果指定了PRIMARY KEY与排序字段不一致,要保证PRIMARY KEY 指定的主键是ORDER BY 指定字段的前缀,比如:
--允许
... ...
ORDER BY (A,B,C)
PRIMARY KEY A
--报错
... ...
ORDER BY (A,B,C)
PRIMARY KEY B
DB::Exception: Primary key must be a prefix of the sorting key
这种强制约束保障了即便在两者定义不同的情况下,主键仍然是排序键的前缀,不会出现索引与数据顺序混乱的问题。
#在库 newdb中创建表 t_mt ,使用MergeTree引擎
node1 :) create table t_mt(
:-] id UInt8,
:-] name String,
:-] age UInt8,
:-] birthday Date,
:-] location String
:-] ) engine = MergeTree()
:-] order by (id,age)
:-] partition by toYYYYMM(birthday);
#向表中插入数据
node1 :) insert into t_mt values (1,'张三',18,'2021-06-01','上海'),
:-] (2,'李四',19,'2021-02-10','北京'),
:-] (3,'王五',12,'2021-06-01','天津'),
:-] (1,'马六',10,'2021-06-18','上海'),
:-] (5,'田七',22,'2021-02-09','广州');
#查看表中的数据
node1 :) select * from t_mt;
SELECT *
FROM t_mt
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 1 │ 马六 │ 10 │ 2021-06-18 │ 上海 │
│ 1 │ 张三 │ 18 │ 2021-06-01 │ 上海 │
│ 3 │ 王五 │ 12 │ 2021-06-01 │ 天津 │
└───┴──────┴─────┴──────────┴─────────┘
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 2 │ 李四 │ 19 │ 2021-02-10 │ 北京 │
│ 5 │ 田七 │ 22 │ 2021-02-09 │ 广州 │
└────┴─────┴─────┴───────────┴────────┘
5 rows in set. Elapsed: 0.006 sec.
继续向表 t_mt中插入以下数据条目:
#向表t_mt中继续插入以下数据
node1 :) insert into t_mt values (1,'赵八',11,'2021-06-08','北京'),
:-] (2,'李九',19,'2021-02-10','天津'),
:-] (3,'郑十',12,'2021-07-01','北京');
#继续查询表 t_mt中的数据
node1 :) select * from t_mt;
SELECT *
FROM t_mt
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 1 │ 马六 │ 10 │ 2021-06-18 │ 上海 │
│ 1 │ 张三 │ 18 │ 2021-06-01 │ 上海 │
│ 3 │ 王五 │ 12 │ 2021-06-01 │ 天津 │
└────┴──────┴─────┴────────────┴──────────┘
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 2 │ 李四 │ 19 │ 2021-02-10 │ 北京 │
│ 5 │ 田七 │ 22 │ 2021-02-09 │ 广州 │
└────┴──────┴─────┴────────────┴──────────┘
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 1 │ 赵八 │ 11 │ 2021-06-08 │ 北京 │
│ 7 │ 郑十 │ 17 │ 2021-06-01 │ 北京 │
└────┴──────┴─────┴────────────┴──────────┘
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 6 │ 李九 │ 19 │ 2021-02-10 │ 天津 │
└────┴──────┴─────┴────────────┴──────────┘
8 rows in set. Elapsed: 0.008 sec.
可以看到新插入的数据新生成了数据块,实际上这里在底层对应新的分区文件片段,那么为什么新插入的数据没有根据日期和之前的数据放入同一个分区文件呢?MergeTree引擎会在插入数据15分钟左右,将同一个分区的各个分区文件片段合并成一整个分区文件。这里也可以手动执行OPTIMIZE 语句手动触发合并。
#手动触发表t_mt 的分区合并
node1 :) optimize table t_mt partition '202102';
node1 :) optimize table t_mt partition '202106';
注意:以上optimize 操作,也可以直接写 optimize table t_mt, 每次执行合并一个分区,如果有多个分区需要执行多次。如果想一次合并所有分区,也可以写成 optimize table t_mt final;
#查看表 t_mt表中的数据,按照相同的分区进行了合并。
node1 :) select * from t_mt;
SELECT *
FROM t_mt
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 1 │ 马六 │ 10 │ 2021-06-18 │ 上海 │
│ 1 │ 赵八 │ 11 │ 2021-06-08 │ 北京 │
│ 1 │ 张三 │ 18 │ 2021-06-01 │ 上海 │
│ 3 │ 王五 │ 12 │ 2021-06-01 │ 天津 │
│ 7 │ 郑十 │ 17 │ 2021-06-01 │ 北京 │
└────┴──────┴─────┴────────────┴──────────┘
┌─id─┬─name─┬─age─┬───birthday─┬─location─┐
│ 2 │ 李四 │ 19 │ 2021-02-10 │ 北京 │
│ 5 │ 田七 │ 22 │ 2021-02-09 │ 广州 │
│ 6 │ 李九 │ 19 │ 2021-02-10 │ 天津 │
└────┴──────┴─────┴────────────┴──────────┘
8 rows in set. Elapsed: 0.004 sec.
注意:MergeTree引擎表中主键并不用于去重,而是用于索引,加快查询速度。
如需博文中的资料请私信博主。