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

news2024/12/23 1:58:28

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

DB::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.coloradmin.cn/o/840502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通义千问7B本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Flink开发环境准备: centos-jdk8

linux-jdk8 - Flink开发环境准备 一、基本介绍二、环境准备1.1 JDK环境1.2 开发工具1.3 Maven环境 三、flink下载安装配置3.1 Flink下载3.2 flink本地模式安装 - linux3.3 常用配置3.4 日志的查看和配置 四、单机 Standalone 的方式运行 Flink 一、基本介绍 Flink底层源码是基于…

架构,性能和游戏 《游戏编程模式》学习笔记

开新坑,准备把《游戏编程模式》这本书啃完。这是一本讲设计模式的书,针对游戏开发而作,写得很好。 以下是读书笔记,文末有原文链接 每个程序都有一定的软件架构,哪怕是全塞到main里也是一种架构好的架构可以把代码写成…

【LeetCode 75】第二十题(2215)找出两数组的不同

目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 找出两个数组中不一样的数,将nums1中有的数而nums2没有的数放在res[0]中,将nums2中有的数二nums1没有的数放在res[1]中. 那我们…

路由器静态路由实验

介绍 静态路由是由管理员手动配置和维护的路由。 如何理解静态路由了?配置一条静态路由就是告诉路由器怎么去往某个目的ip或ip地址段。去往目的地的时候需要查找路由表。 静态路由优缺点: 优点: 静态路由配置简单,并且无需动态…

03.利用Redis实现缓存功能---解决缓存穿透版

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis实现添加缓存功能解决缓存穿透版 学习产出&#xff1a; 缓存穿透讲解图&#xff1a; 解决方案&#xff1a; 采用缓存空对象采用布隆过滤器 解决方案流程图&#xff1a; 1. 准备pom环境 <dependency><gro…

完整模型的训练套路

从心所欲 不逾矩 天大地大 皆可去 一、官方模型的初使用 使用VGG16模型 VGG模型使用代码示例&#xff1a; import torchvision.models from torch import nndataset torchvision.datasets.CIFAR10(/cifar10, False, transformtorchvision.transforms.ToTensor())vgg16_true …

百度智能创做AI平台

家人们好&#xff0c;在数字化时代&#xff0c;人工智能正引领着一场前所未有的创新浪潮。今天&#xff0c;我们将为大家介绍百度智能创做AI平台&#xff0c;这个为创意赋能、助力创作者的强大工具。无论你是创意工作者、内容创作者&#xff0c;还是想要释放内心创造力的个人&a…

人工智能巨头齐聚,研究和掌控人工智能

这四家公司表示&#xff0c;他们成立了Frontier Model Forum&#xff0c;以确保"前沿AI模型的安全和负责任的开发"。 四家全球最先进的人工智能公司成立了一个研究日益强大的人工智能并建立最佳控制实践的组织&#xff0c;随着公众对技术影响的担忧和监管审查的增加…

Python(七十)元组的遍历

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

基于MFCC特征提取和HMM模型的语音合成算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 ............................................................................ %hmm是已经…

桥接模式(C++)

定义 将抽象部分(业务功能)与实现部分(平台实现)分离&#xff0c;使它们都可以独立地变化。 使用场景 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个纬度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型…

一分钟完成centos7安装docker

action: 1、下载安装包2、安装docker 1、背景 使用CentOS / Redhat 7 版本的应该偏多。但是&#xff0c;Docker CE在系统中安装的时候&#xff0c;往往会出现一堆依赖包的报错&#xff0c;解决依赖包需要耗费不短的时间。 经验证&#xff0c;目前已找到兼容能力强的版本&am…

debug思路 - maven构建报错

问题&#xff1a;maven面板中&#xff0c;进行compile、deploy操作时报错。 debug步骤&#xff1a; 1、鼠标右键选择“修改运行配置”。在运行命令中添加参数-X&#xff0c;用于产生执行调试输出。例如&#xff1a;compile -f -X pom.xml。 2、再次进行compile、deploy操作&…

利用线程池多线程并发实现TCP两端通信交互,并将服务端设为守护进程

文章目录 实现目标实现步骤封装日志类封装线程池封装线程封装锁封装线程池 TCP通信的接口和注意事项accept TCP封装任务客户端Client.hppClient.cc 服务端Server.hpp Server.cc实现效果 守护进程服务端守护进程化 实现目标 利用线程池多线程并发实现基于TCP通信的多个客户端与…

《向量数据库指南》——腾讯云向量数据库Tencent Cloud VectorDB应用场景

目录 大模型知识库 推荐系统 问答系统 文本/图像检索 大模型知识库 腾讯云向量数据库可以和大语言模型 LLM 配合使用。企业的私域数据在经过文本分割、向量化后,可以存储在腾讯云向量数据库中,构建起企业专属的外部知识库,从而在后续的检索任务中,为大模型提供提示信息…

C语言每日一题:14《数据结构》复制带随机指针的链表

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 找相对位置暴力求解的方法&#xff1a; 1.复制一个新的链表出来遍历老的节点给新的节点赋值&#xff0c;random这个时候不去值。 2.两个链表同时遍历&#xff0c;遍历老链表的时候去寻找相对位置&#xff0c;在遍…

「Qt」常用事件介绍

&#x1f514; 在开始本文的学习之前&#xff0c;笔者希望读者已经阅读过《「Qt」事件概念》这篇文章了。本文会在上篇文章的基础上&#xff0c;进一步介绍 Qt 中一些比较常用的事件。 0、引言 当我们想要让控件收到某个事件时做一些操作&#xff0c;通常都需要重写相应的事件处…

Mysql如何实现XA规范

文章目录 一、什么是XA二、XA规范涉及到的角色&#xff0c;以及相关概念1. XA规范涉及到的角色包括&#xff1a;1.1 事务管理器&#xff08;Transaction Manager&#xff09;&#xff1a;1.2 资源管理器&#xff08;Resource Manager&#xff09;&#xff1a; 2. 相关概念包括&…

复原 IP 地址——力扣93

文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<