Clickhouse-表引擎探索之MergeTree

在这里插入图片描述

引言

前文曾说过,Clickhouse是一个强大的数据库Clickhouse-一个潜力无限的大数据分析数据库系统
其中一个强大的点就在于支持各类表引擎以用于不同的业务场景。

MergeTree

MergeTree系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。

其主要特点:

  • 存储的数据按主键排序。
  • 这使得您能够创建一个小型的稀疏索引来加快数据检索。
  • 如果指定了分区键的话,可以使用分区。
  • 在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能。
  • 支持数据副本。
  • 支持数据采样。

MergeTree表引擎的基础建表语句如下

CREATE TABLE table_name
(`column_1` String,`column_2` Int32,`column_3` String
)
ENGINE = MergeTree
PARTITION BY column
ORDER BY column
  • ORDER BY:排序键,可以是单列或多列。通常没有显示指定主键的情况下,我们会指定一个排序键,Clickhouse也会自动使用排序键作为主键
  • PARTITION BY:分区键。通常使用Clickhouse都会存储“大数据”,既然是大数据,用分区来隔离数据会大大提升后续查询效率。多半用月分区的情况下, 可使用表达式toYYYYMM(date_column)来实现。

还有更多参数可选配,请参考
Clickhouse-MergeTree

ReplacingMergeTree

ReplacingMergeTree与MergeTree的不同在于它会删除排序键值相同的重复数据。
数据的去重只会在数据合并期间进行。但是合并会在后台一个不确定的时间进行,所以数据并不是有规律的进行删除\合并。
当然Clickhouse支持使用OPTIMIZE进行手动合并数据,不过会引起对数据的大量读写(建议在业务低峰期执行)。

ReplacingMergeTree的建表语句通常为

CREATE TABLE table_name
(`column_time` DateTime,`column_order` Int32,`vd` String
)
ENGINE = ReplacingMergeTree(column_time)
PARTITION BY vd
ORDER BY column_order

数据合并(去重)策略为,当order by 字段重复时,保留ReplacingMergeTree字段最大的一条

测试看下效果

1、建表

CREATE TABLE t1
(`column_time` DateTime,`column_order` Int32,`vd` String
)
ENGINE = ReplacingMergeTree(column_time)
PARTITION BY vd
ORDER BY column_order

2、插入数据

INSERT INTO TABLE t1 VALUES ('2024-03-28 10:00:01', 1,'20240338') ;
INSERT INTO TABLE t1 VALUES ('2024-03-28 10:00:02', 1,'20240338') ;
INSERT INTO TABLE t1 VALUES ('2024-03-28 10:00:03', 1,'20240338') ;
INSERT INTO TABLE t1 VALUES ('2024-03-28 10:00:04', 1,'20240338') ;
INSERT INTO TABLE t1 VALUES ('2024-03-28 10:00:05', 1,'20240338') ;

3、验证
可以看到表中最终只有(‘2024-03-28 10:00:05’, 1,‘20240338’)这条数据
在这里插入图片描述

彩蛋

在文章开头,MergeTree之所谓被称为系列,是因为在Clickhouse由MergeTree衍生出了很多相关类型的引擎

  • MergeTree
  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree
  • GraphiteMergeTree

其他引擎后续有机会在生产验证后再与大家分享。

在这里插入图片描述

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

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

相关文章

kubernetes用户权限管理详解——普通用户[kubeconfig]

原文: 学一下https://suxueit.com/article_detail/tdVymI4BWZdDRfKqnv1y K8s 的用户分为两类 普通用户:普通用户是指集群外部的人或系统管理,它们不由 Kubernetes 直接管理。普通用户的证书、密钥和权限管理通常由外部系统(如企业…

科创新格局·共赢双循环“2024上海智能科技与创新展览会”

2024上海智能科技与创新展览会,将于6月中旬在上海新国际博览中心隆重召开。作为一场盛大的科技盛会,此次展览会将汇聚科技前瞻趋势,融合产业贸易优势,布局初创投资赛道,提供全方位场景生态的跨界合作,构建“…

算法之美:B+树原理、应用及Mysql索引底层原理剖析

B树的一种变种形式,B树上的叶子结点存储关键字以及相应记录的地址,同等存储空间下比B-Tree存储更多Key。非叶子节点不对关键字记录的指针进行保存,只进行数据索引 , 树的层级会更少 , 所有叶子节点都在同一层, 叶子节点的关键字从小到大有序排…

Linux基本指令篇

在前边,我们已经了解过了Linux操作系统的发展和应用,从该篇起,就正式进入对Linux的学习。 今天我们就来在Xshell上远程登录我们的云服务器。首先我们要知道自己云服务器的公网ip,然后修改一下密码。 点击跳转 修改完密码之后我们…

跑通飞浆平台的MTMCT 跨镜跟踪示例

想跑通飞浆平台的MTMCT跨镜跟踪示例,真的是难上加难啊! 改了几处代码,可以顺利跑通了,特此记录: 第一处:不要拉主线的代码,改成 !git clone https://gitee.com/paddlepaddle/PaddleDetection…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文,英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国,请记住我给出的原理,不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步:我们打开Uni…

pytorch-tpu/llama推理优化之input prompt bucketing

数据更新: python脚本(注意分支): HLO图分析KV-Cache更新: KV-Cache作为HLO图的输入输出:bf16[1,2048,32,128]{3,2,1,0} 128x, 2x32x2 参考链接 notes for transformer introduction by an Italian t…

引领向量数据库技术新变革,Milvus 2.4 正式上线

备受关注的 Milvus 2.4 正式上线! 作为向量数据库赛道的领军者,Zilliz 一直致力于推动向量技术的进步与创新。本次发布中,Milvus 新增支持基于 NVIDIA 的 GPU 索引—— CUDA 加速图形索引(CAGRA),突破了现有向量搜索的能力。 GPU 索引是向量数据库技术中的重要里程碑,…

做现货白银,要直面实时行情走势!

现货白银拥有完善的交易机制,它每天的实时行情走势中充满着交易获利的机会,但不见得每一位投资者都有把握住的能力。在各种资讯都触手可及的今天,投资者可以轻松地获得现与货白银相关的交易技巧,然而交易的智慧,则需要…

ubuntu23.10配置RUST开发环境

系统版本: gcc版本 下载rustup安装脚本: curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh下载完成后会自动执行 选择默认安装选项 添加cargo安装目录到环境变量 vim ~/.bashrc 默认已添加 使用环境变量立即生效 source ~/.bashrc 执行rust开发环境,在终端输入…

扫雷(蓝桥杯)

题目描述 小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下, 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi , yi ,ri) 表示在坐标 (xi , yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片土…

19-错误处理(下):如何设计错误包?

业界有很多优秀的、开源的错误包可供选择,例如Go标准库自带的errors包、github.com/pkg/errors包。 错误包需要具有哪些功能? 在我看来,至少需要有下面这六个功能: 首先,应该能支持错误堆栈。 假设保存在bad.go文件…