ClickHouse(十一):Clickhouse MergeTree系列表引擎 - MergeTree(1)

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注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。

1. MergeTree

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

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

  1. 存储的数据按照主键排序:创建稀疏索引加快数据查询速度。
  2. 支持数据分区,可以通过PARTITION BY语句指定分区字段。
  3. 支持数据副本。
  4. 支持数据采样。

2. 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, ...]
  • 关于以上建表语句的解释如下:
  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--报错... ...ORDER BY (A,B,C)PRIMARY KEY BDB::Exception: Primary key must be a prefix of the sorting key

这种强制约束保障了即便在两者定义不同的情况下,主键仍然是排序键的前缀,不会出现索引与数据顺序混乱的问题。

  1. SAMPLE BY:采样字段,如果指定了该字段,那么主键中也必须包含该字段。比如 SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID))。可选。
  2. TTL:数据的存活时间。在MergeTree中,可以为某个列字段或整张表设置TTL。当时间到达时,如果是列字段级别的TTL,则会删除这一列的数据;如果是表级别的TTL,则会删除整张表的数据。可选。
  3. SETTINGS:额外的参数配置。可选。

3. 示例一

#在库 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 语句手动触发合并。

4. 示例二

#手动触发表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引擎表中主键并不用于去重,而是用于索引,加快查询速度。

​​​​​​


👨‍💻如需博文中的资料请私信博主。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/58339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛阳Geotrust旗下有RapidSSL https证书吗

Geotrust是知名的CA认证机构,旗下的https数字证书产品众多,Geotrust的数字证书具有高度的兼容性和可信度,得到了全球用户的广泛认可和信赖。Geotrust是一家全球领先的数字证书颁发机构,提供多种数字证书服务,包括SSL证…

漫画算法做题笔记

诸神缄默不语-个人CSDN博文目录 哦这是我三年前写的,我现在Java语法都快忘光了…… 反正之前的博文也发一下好了。这个因为我当年是用有道云笔记而不是直接用CSDN编辑器写的,所以后面有些内容写乱了,因为我现在猛的一看有点看不懂&#xff0…

Tailwind CSS:简洁高效的工具,提升前端开发体验

112. Tailwind CSS:简洁高效的工具,提升前端开发体验 1. 什么是Tailwind CSS? Tailwind CSS是由Adam Wathan、Jonathan Reinink、David Hemphill和Steve Schoger等人共同创建的一种现代CSS框架。与传统的CSS框架不同,Tailwind CS…

C语言学习笔记 vscode使用外部console-11

前言 在默认情况下,我们运行C语言程序都是在vscode终端的,在小程序运行时这个是没有问题的,但是当程序变得复杂它就不好用了,这时我们可以将这个终端设置为外部console,这样方便处理更多、更复杂的程序。 步骤 1.点击…

zookeeper --- 基础篇

一、zookeeper简介 1.1、什么是zookeeper zookeeper官网:https://zookeeper.apache.org/ 大数据生态系统里的很多组件的命名都是某种动物或者昆虫,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小 猪)的管理员。顾名思义就是管理…

网络防御(7)

课堂实验 R1 [Huawei] int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 100.1.12.2 24 protocolAug 1 2023 10:24:09-08:00 Huawei gOlIFNET/4/LINK STATE(1)[4]:The1ineIp on the interface GigabitEthernet0/0/0 has entered the Up state. [Huawei-GigabitEthernet0/0/…

python中文官网下载安装,python官方中文文档下载

大家好,小编来为大家解答以下问题,python官网下载步骤图解,python官方中文文档下载,现在让我们一起来看看吧! python官网网址 python官方网站 python官网网址中文。像我们想要抓住一门好的编程语言,如何开始…

vue 路由页面跳转

从index.vue跳转到data.vue index.vue <el-table-column label"客户数" align"center" :show-overflow-tooltip"true"><template slot-scope"scope"><router-link :to"/system/enterprise-data/index/ scope.ro…

如何解决 Elasticsearch 查询缓慢的问题以获得更好的用户体验

作者&#xff1a;Philipp Kahr Elasticsearch Service 用户的重要注意事项&#xff1a;目前&#xff0c;本文中描述的 Kibana 设置更改仅限于 Cloud 控制台&#xff0c;如果没有我们支持团队的手动干预&#xff0c;则无法进行配置。 我们的工程团队正在努力消除对这些设置的限制…

flutter:二维码生成与读取

前言 这csdn真的是服了&#xff0c;图片里有个二维码就直接变成违规图片了。至于效果的话&#xff0c;自己运行一下看看吧。 生成 flutter中生成二维码可以使用 qr_flutter。 官方文档 https://pub-web.flutter-io.cn/packages/qr_flutter 安装 flutter pub add qr_flutt…

源码分析——ConcurrentHashMap源码+底层数据结构分析

文章目录 1. ConcurrentHashMap 1.71. 存储结构2. 初始化3. put4. 扩容 rehash5. get 2. ConcurrentHashMap 1.81. 存储结构2. 初始化 initTable3. put4. get 3. 总结 1. ConcurrentHashMap 1.7 1. 存储结构 Java 7 中 ConcurrentHashMap 的存储结构如上图&#xff0c;Concurr…

git的日常使用

加入忽略列表&#xff1a;在.gitignore中加入忽略的文件&#xff0c;build/ 表示build文件夹下&#xff0c;*.jar 表示以jar结尾的&#xff0c;用换行符隔开将另一个分支合并到当前分支&#xff1a;git merge xxx冲突出现&#xff0c;可以看看这里&#xff1a;详解Git合并冲突—…