Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ClickHouse各种MergeTree的关系与作用

ClickHouse各种MergeTree的关系与作用

作者头像
Nauu
发布于 2020-03-25 18:56:03
发布于 2020-03-25 18:56:03
8.8K00
代码可运行
举报
运行总次数:0
代码可运行

ClickHouse的整个体系里面,MergeTree表引擎绝对是一等公民,使用ClickHouse就是在使用MergeTree,这种说法一点也不为过。

众所周知,MergeTree表引擎是一个家族系列,目前整个系列一共包含了14种不同类型的MergeTree,可谓是功能丰富了吧?

但凡事都有两面性,功能丰富的同时也无疑让很多朋友犯了难。

这么多表引擎,它们之间是什么关系?

我们到底应该使用哪一种表引擎?

今天我就用这篇文章,尝试回答上述两个高频问题。

老师常教导我们要训练结构化思维,通过抽象、归纳等办法来分析一个事物,有时候会起到事半功倍的效果。


这么多表引擎,它们之间是什么关系?

我们可以使用两种关系,来理解整个MergeTree系列:

  • 继承关系

首先,为了便于理解,可以使用继承关系来看待MergeTree。通过最基础的MergeTree表引擎,向下派生出6个变种表引擎,如下图所示

在ClickHouse底层具体的实现方法中,上述7种表引擎的区别主要体现在Merge合并的逻辑部分。如下图所示,是我简化后的对象关系:

可以看到,在具体的实现逻辑部分,7种MergeTree共用一个主体,在触发Merge动作时,调用了各自独有的合并逻辑。

而除开MergeTree之外的其他6个变种表引擎,它们的Merge合并逻辑,全部是建立在MergeTree基础之上的,如下图所示:

它们均继承于MergeTree的 MergingSortedBlockInputStream。

MergingSortedBlockInputStream 的主要作用,是按照ORDER BY的规则保持新分区数据的有序性。

而其他6种变种MergeTree的合并逻辑,则是在有序的基础之上 "各有所长",要么是将排序后相邻的重复数据消除、亦或是将它们累加汇总。

所以,从继承关系的角度来理解,我们不仅明白了这7种MergeTree的关系,也进一步明确了一个事实,它们的主要区别在Merge部分的逻辑,所以特殊功能只会在Merge合并时才会触发。

  • 组合关系

刚才已经介绍了7种MergeTree的关系,余下的7种是ReplicatedMergeTree系列。

ReplicatedMergeTree与普通的MergeTree又有什么区别呢? 我们接着看下面这张图:

图中的虚线框部分是MergeTree的能力边界,而ReplicatedMergeTree在它的基础之上增加了分布式协同的能力。

借助ZooKeeper的消息日志广播,实现了副本实例之间的数据同步功能。

ReplicatedMergeTree系列可以用组合关系来理解,如下图所示:

当我们为7种MergeTree加上Replicated前缀后,又能组合出7种新的表引擎,这些ReplicatedMergeTree拥有副本协同的能力。


我们到底应该使用哪一种表引擎?

现在回答第二个问题,按照使用的场景划分,可以将上述14种表引擎大致分成以下6类应用场景:

  • 默认情况

在没有特殊要求的场合,使用基础的MergeTree表引擎即可,它不仅拥有高效的性能,也提供了所有MergeTree共有的基础功能,包括列存、数据分区、分区索引、一级索引、二级索引、TTL、多路径存储等等。

与此同时,它也定义了整个MergeTree家族的基调,例如:

ORDER BY 决定了每个分区中数据的排序规则;

PRIMARY KEY 决定了一级索引(primary.idx);

ORDER BY 可以指代PRIMARY KEY, 通常只用声明ORDER BY 即可。

接下来将要介绍的其他表引擎,除开ReplicatedMergeTree系列外,都是在Merge合并动作时添加了各自独有的逻辑。

  • 数据去重

通过刚才的说明,大家应该明白,MergeTree的主键(PRIMARY KEY)只是用来生成一级索引(primary.idx)的,并没有唯一性约束这样的语义。

一些朋友在使用MergeTree的时候,用传统数据库的思维来理解MergeTree就会出现问题。

如果业务上不允许数据重复,遇到这类场景就可以使用ReplacingMergeTree,如下图所示:

ReplacingMergeTree通过ORDER BY,表示判断唯一约束的条件。当分区合并之时,根据ORDER BY排序后,相邻重复的数据会被排除。

由此,可以得出几点结论:

第一,使用ORDER BY作为特殊判断标识,而不是PRIMARY KEY。关于这一点网上有一些误传,但是如果理解了ORDER BYPRIMARY KEY的作用,以及合并逻辑之后,都能够推理出应该是由ORDER BY决定。

ORDER BY的作用, 负责分区内数据排序;

PRIMARY KEY的作用, 负责一级索引生成;

Merge的逻辑, 分区内数据排序后,找到相邻的数据,做特殊处理。

第二,只有在触发合并之后,才能触发特殊逻辑。以去重为例,在没有合并的时候,还是会出现重复数据。

第三,只对同一分区内的数据有效。以去重为例,只有属于相同分区的数据才能去重,跨越不同分区的重复数据不能去重。

上述几点结论,适用于包含ReplacingMergeTree在内的6种MergeTree,所以后面不在赘述。

  • 预聚合(数据立方体)

有这么一类场景,它的查询主题是非常明确的,也就是说聚合查询的维度字段是固定,并且没有明细数据的查询需求,这类场合就可以使用SummingMergeTree或是AggregatingMergeTree,如下图所示:

可以看到,在新分区合并后,在同一分区内,ORDER BY条件相同的数据会进行合并。如此一来,首先表内的数据行实现了有效的减少,其次度量值被预先聚合,进一步减少了后续计算开销。

聚合类MergeTree通常可以和表引擎协同使用,如下图所示:

可以将物化视图设置成聚合类MergeTree,将其作为固定主题的查询表使用。

值得一提的是,通常只有在使用SummingMergeTree或AggregatingMergeTree的时候,才需要同时设置ORDER BYPRIMARY KEY。

显式的设置PRIMARY KEY,是为了将主键和排序键设置成不同的值,是进一步优化的体现。

例如某个场景的查询需求如下:

聚合条件,GROUP BY A,B,C

过滤条件,WHERE A

此时,如下设置将会是一种较优的选择:

GROUP BY A,B,C

PRIMARY KEY A

BTW,如果ORDER BYPRIMARY KEY不同,PRIMARY KEY必须是ORDER BY的前缀(为了保证分区内数据和主键的有序性)。

  • 数据更新

数据的更新在ClickHouse中有多种实现手段,例如按照分区Partition重新写入、使用Mutation的DELETE和UPDATE查询。

使用CollapsingMergeTree或VersionedCollapsingMergeTree也能实现数据更新,这是一种使用标记位,以增代删的数据更新方法,如下图所示:

通过增加一个标志字段(例如图中的sigh字段),作为数据有效性的判断依据。

可以看到,在新分区合并后,在同一分区内,ORDER BY条件相同的数据,其标志值为1和-1的数据行会进行抵消。

下图是另外一种便于理解的视角,就如同挤压瓦楞纸一般,数据被抵消了:

CollapsingMergeTree和VersionedCollapsingMergeTree的区别又是什么呢?

CollapsingMergeTree对数据写入的顺序是敏感的,它要求标志位需要按照正确的顺序排序。例如按照1,-1的写入顺序是正确的; 而如果按照-1,1的错误顺序写入,CollapsingMergeTree就无法正确抵消。

试想,如果在一个多线程并行的写入场景,我们是无法保证这种顺序写入的,此时就需要使用VersionedCollapsingMergeTree了。

VersionedCollapsingMergeTree在CollapsingMergeTree基础之上,额外要求指定一个version字段,在分区Merge合并时,它会自动将version字段追加到ORERY BY的末尾,从而保证了标志位的有序性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ENGINE = VersionedCollapsingMergeTree(sign,ver)ORDER BY id//等效于ORDER BY id,ver
  • 监控集成

GraphiteMergeTree可以与Graphite集成,如果你使用了Graphite作为系统的运行监控系统, 则可以通过GraphiteMergeTree存储指标数据,加速查询性能、降低存储成本。

  • 高可用

Replicated* 拥有数据副本的能力,如下图所示:

结合刚才的5类场景,如果进一步需要高可用的需求,选择一种MergeTree和Replicated组合即可,例如ReplicatedMergeTree、ReplicatedReplacingMergeTree等等。

读完这篇文章,你是否对ClickHouse的MergeTree家族有了更深刻的认识呢?如果仍有疑问,欢迎观看我在腾讯云做的ClickHouse科普直播,地址如下:

ClickHouse的前世今生-直播回放

在视频中我也专门介绍了ClickHouse的表引擎部分。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ClickHouse的秘密基地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【ClickHouse为什么这么快?】MergeTree 表存储引擎图文实例详解
ClickHouse 是俄罗斯最大的搜索引擎Yandex在2016年开源的数据库管理系统(DBMS),主要用于联机分析处理(OLAP)。其采用了面向列的存储方式,性能远超传统面向行的DBMS,近几年受到广泛关注。
一个会写诗的程序员
2021/12/16
2K0
【ClickHouse为什么这么快?】MergeTree 表存储引擎图文实例详解
ClickHouse *MergeTree表引擎
Clickhouse 中最强大的表引擎当属 MergeTree引擎及*MergeTree中的其他分支引擎。
MySQL轻松学
2019/09/20
5.6K0
ClickHouse表引擎之MergeTree
1. ClickHource 建表引擎的功能 1. 数据的存储方式 2. 是否可以使用索引 3. 数据的存储位置 4. 并发数据的访问 5. 是否可以使用分区 6. 是否支持数据的副本 2.ClickHouse 的表引擎分为四大类 1. MergeTree 系列引擎 2. Log 系列引擎 3. 与其他存储/处理系统集成的引擎 4.特定功能的引擎 每个引擎都包含了多个具体的引擎,每个引擎均都有使用的场景。 3. 详细来说说MergeTree 系列引擎 3.1M
小晨说数据
2022/03/10
8370
ClickHouse表引擎之MergeTree
ClickHouse系列--项目方案梳理
MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。
IT云清
2021/12/06
1.5K0
ClickHouse原理解析与应用实战
◆ ClickHouse概念 clickhouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS),由俄罗斯最大的搜索公司Yandex开发,于2016年开源,采用c++开发。 ◆ OLAP 和 OLTP 这两个概念 OLAP(On-Line Analytical Processing):联机分析处理OLAP(On-Line Analytical Processing),仓库型数据库,主要是读取数据,做复杂数据分析(多维),侧重技术决策支持,提供直观简单的结果,开源OLAP引擎包含Hive、Sp
IT大咖说
2022/06/17
2.3K0
ClickHouse原理解析与应用实战
大数据ClickHouse进阶(二):MergeTree表引擎
在所有的表引擎中,最为核心的当属MergeTree系列表引擎,这些表引擎拥有最为强大的性能和最广泛的使用场合。对于非MergeTree系列的其他引擎而言,主要用于特殊用途,场景相对有限。而MergeTree系列表引擎是官方主推的存储引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,支持几乎所有ClickHouse核心功能。
Lansonli
2022/09/14
1.3K0
大数据ClickHouse进阶(二):MergeTree表引擎
4万字长文 | ClickHouse基础&实践&调优全视角解析
Clickhouse 是一个高性能且开源的数据库管理系统,主要用于在线分析处理 (OLAP) 业务。它采用列式存储结构,可使用 SQL 语句实时生成数据分析报告,另外它还支持索引,分布式查询以及近似计算等特性,凭借其优异的表现,ClickHouse 在各大互联网公司均有广泛地应用。
王知无-import_bigdata
2021/07/12
6K0
4万字长文 | ClickHouse基础&实践&调优全视角解析
Clickhouse-MergeTree原理解析
表引擎是ClickHouse设计实现中的一大特色。可以说,是表引擎决定了一张数据表最终的“性格”,比如数据表拥有何种特性、数据以何种形式被存储以及如何被加载。ClickHouse拥有非常庞大的表引擎体系,截至本书完成时,其共拥有合并树、外部存储、内存、文件、接口和其他6大类20多种表引擎。而在这众多的表引擎中,又属合并树(MergeTree)表引擎及其家族系列(*MergeTree)最为强大,在生产环境的绝大部分场景中,都会使用此系列的表引擎。因为只有合并树系列的表引擎才支持主键索引、数据分区、数据副本和数据采样这些特性,同时也只有此系列的表引擎支持ALTER相关操作。合并树家族自身也拥有多种表引擎的变种。其中MergeTree作为家族中最基础的表引擎,提供了主键索引、数据分区、数据副本和数据采样等基本能力,而家族中其他的表引擎则在MergeTree的基础之上各有所长。例如ReplacingMergeTree表引擎具有删除重复数据的特性,而SummingMergeTree表引擎则会按照排序键自动聚合数据。如果给合并树系列的表引擎加上Replicated前缀,又会得到一组支持数据副本的表引擎,例如ReplicatedMergeTree、ReplicatedReplacingMergeTree、ReplicatedSummingMergeTree等。合并树表引擎家族如图所示:
Flink实战剖析
2022/04/18
1.4K0
Clickhouse-MergeTree原理解析
《Everything is Table,我该使用哪种表引擎》- part 2
书接上回,今天放出第一章节的第二部分,我专门新建了一个专辑方便大家回看,传送: ClickHouse实战系列课程
Nauu
2021/07/29
9410
大数据ClickHouse(八):MergeTree系列表引擎之MergeTree(重点掌握)
在所有的表引擎中,最为核心的当属MergeTree系列表引擎,这些表引擎拥有最为强大的性能和最广泛的使用场合。对于非MergeTree系列的其他引擎而言,主要用于特殊用途,场景相对有限。而MergeTree系列表引擎是官方主推的存储引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,支持几乎所有ClickHouse核心功能。
Lansonli
2022/08/17
9000
大数据ClickHouse(八):MergeTree系列表引擎之MergeTree(重点掌握)
ClickHouse的表引擎介绍(三)
官方网站:https://clickhouse.com/docs/zh/engines/table-engines/
Java技术债务
2022/08/09
1.3K0
ClickHouse 表引擎 & ClickHouse性能调优 - ClickHouse团队 Alexey Milovidov
显然RAM可能比磁盘慢,例如单个clnannel RAM与10倍 PCIe 4.0 SSD。
一个会写诗的程序员
2021/12/16
2.3K0
ClickHouse 表引擎 & ClickHouse性能调优 - ClickHouse团队 Alexey Milovidov
ClickHouse MergeTree 实现只有一次语义的插入
ClickHouse 作为 OLAP 数据库,做了大量的插入、查询性能优化,比如 MergeTree 引擎基于 LSM 树结构,优化了查询性能(特别是范围查询)。
charmer
2024/05/15
2800
ClickHouse MergeTree 实现只有一次语义的插入
CK01# ClickHouse术语及知识点梳理
尽管使用ElasticSearch冷热存储架构来存储日志,成本依旧高昂,而ElasticSearch的存储成本占用70%以上,寻找新的低成本存储方案也就成了主要解决方式。
瓜农老梁
2022/06/23
7900
CK01# ClickHouse术语及知识点梳理
ClickHouse(07)ClickHouse数据库引擎解析
支持非阻塞的DROP TABLE和RENAME TABLE查询和原子的EXCHANGE TABLES t1 AND t2查询。默认情况下使用Atomic数据库引擎。
张飞的猪
2024/03/10
4680
ClickHouse(07)ClickHouse数据库引擎解析
趣头条基于ClickHouse玩转每天1000亿数据量
随着公司规模越来越大,业务线越来越多,公司的指标规模也在急速增长,现有的基于storm实时计算的指标计算架构的缺点越来越凸显,所以我们急需对现有的架构进行调整。
jeanron100
2020/02/19
2.7K0
趣头条基于ClickHouse玩转每天1000亿数据量
Replacing、Summing、Aggregating、Collapsing和VersionedCollapsingMergeTree的区别和使用场景
ReplacingMergeTree和SummingMergeTree是ClickHouse中两种常用的MergeTree引擎。
一凡sir
2023/10/17
6360
Replacing、Summing、Aggregating、Collapsing和VersionedCollapsingMergeTree的区别和使用场景
【ClickHouse 极简教程-图文详解原理系列】ClickHouse 主键索引的存储结构与查询性能优化
这是 Alexey Milovidov(ClickHouse 的创建者)给出的关于复合主键的答案的翻译。 原文: https://groups.google.com/g/clickhouse/c/eUrsP30VtSU/m/p4-pxgdXAgAJ
一个会写诗的程序员
2022/03/07
3.5K0
【ClickHouse 极简教程-图文详解原理系列】ClickHouse 主键索引的存储结构与查询性能优化
故障分析 | ClickHouse 更新操作导致不可写,应该选择哪种表引擎?
作者:张宇,爱可生DBA,负责数据库运维和故障分析。擅长 ClickHouse、MySQL、Oracle,爱好骑行、AI、动漫和技术分享。
爱可生开源社区
2024/09/14
3040
故障分析 | ClickHouse 更新操作导致不可写,应该选择哪种表引擎?
「ClickHouse系列」ClickHouse之MergeTree原理
MergeTree引擎以及隶属于MergeTree引擎族的所有引擎是Clickhouse表引擎中最重要, 最强大的引擎.
王知无-import_bigdata
2022/04/13
3K0
推荐阅读
相关推荐
【ClickHouse为什么这么快?】MergeTree 表存储引擎图文实例详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档