ClickHouse进阶(二):ClickHouse MergeTree表引擎及目录解析

news2025/1/20 22:41:17

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!


目录

1. MergeTree

2. MergeTree引擎表目录解析


在所有的表引擎中,最为核心的当属MergeTree系列表引擎,这些表引擎拥有最为强大的性能和最广泛的使用场合。对于非MergeTree系列的其他引擎而言,主要用于特殊用途,场景相对有限。而MergeTree系列表引擎是官方主推的存储引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,支持几乎所有clickhouse核心功能。

MergeTree系列表引擎包含:MergeTree、ReplacingMergeTree、SummingMergeTree(汇总求和功能)、AggregatingMergeTree(聚合功能)、CollapsingMergeTree(折叠删除功能)、VersionedCollapsingMergeTree(版本折叠功能)引擎,在这些的基础上还可以叠加Replicated和Distributed。

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

​​​​​​​1. MergeTree

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

  1. 存储的数据按照主键排序:创建稀疏索引加快数据查询速度。
  2. 支持数据分区,可以通过PARTITION BY语句指定分区字段。
  3. 支持数据副本。
  4. 支持数据采样。
  • 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:额外的参数配置。可选。

2. MergeTree引擎表目录解析

这里我们介绍下MergeTree引擎表对应到磁盘的数据目录,Clikchouse新版本与之前版本对比,数据对应的磁盘目录略有不同。

创建表t_mt,并加载数据:

node1 :)CREATE TABLE t_mt

(

    `id` UInt8,

    `name` String,

    `age` UInt8,

    `birthday` Date,

    `location` String

)

ENGINE = MergeTree

PARTITION BY toYYYYMM(birthday)

ORDER BY (id, age)



#向表t_mt中插入数据

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','广州');

以上创建好表t_mt,当插入数据完成后,在clickhouse节点/var/lib/clickhouse/data/newdb/路径下会生成对应目录“t_mt”,进入此目录下,可以看到对应的分区目录,如图示:

以上分区目录也可以在系统表“system.parts”中查询得到:

进入到某一个分区目录片段“202102_2_2_0”中,我们可以看到如下目录:

对以上目录的解释如下:

  • checksums.txt:校验文件,使用二进制格式存储。它保存了余下各类文件(primary. idx、count.txt等)的size大小及size的哈希值,用于快速校验文件的完整性和正确性。
  • columns.txt: 存储当前分区所有列信息。使用明文格式存储。
[root@node1 202102_2_2_0]# cat columns.txt

columns format version: 1

5 columns:

`id` UInt8

`name` String

`age` UInt8

`birthday` Date

`location` String
  • count.txt:计数文件,使用明文格式存储。用于记录当前数据分区目录下数据的总行数。
[root@node1 202102_2_2_0]# cat count.txt

2
  • data.bin:数据文件,使用压缩格式存储,默认为LZ4压缩格式,用于存储某一列的数据。之前clickhoue版本是每一个列字段都拥有独立的.bin数据文件,并以列字段名称命名,在新版本clickhouse中所有数据合并到data.bin中。

之前clickhouse版本此目录数据如下:

  • data.mrk3:列字段标记文件,使用二进制格式存储。标记文件中保存了data.bin文件中数据的偏移量信息
  • default_compression_codec.txt:存储数据压缩格式
  • partition.dat与minmax_[Column].idx:如果指定了分区键,则会额外生成partition.dat与minmax索引文件,它们均使用二进制格式存储。partition.dat用于保存当前分区下分区表达式最终生成的值,即分区字段值;而minmax索引用于记录当前分区下分区字段对应原始数据的最小和最大值。比如当使用birthday字段对应的原始数据为2021-02-17、2021-02-23,分区表达式为PARTITION BY toYYYYMM(birthday),即按月分区。partition.dat中保存的值将会是202102,而minmax索引中保存的值将会是2021-02-17、2021-02-23。

clickhouse MergeTree引擎表支持分区,索引,修改,并发查询数据,当查询MergeTree表数据时,首先向primary.idx文件中获取对应的索引,根据索引找到【data.mrk3】文件获取对应的数据块偏移量,然后再根据偏移量从【data.bin】文件中读取块数据。

  • primary.idx:一级索引文件,使用二进制格式存储。用于存放稀疏索引,一张MergeTree表只能声明一次一级索引,即通过ORDER BY或者PRIMARY KEY指定字段。借助稀疏索引,在数据查询的时能够排除主键条件范围之外的数据文件,从而有效减少数据扫描范围,加速查询速度。

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


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

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

相关文章

【VS Code插件开发】消息通信(四)

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! 📢 资料领取:前端…

ModaHub魔搭社区:WinPlan垂直大模型数据采集

WinPlan经营大脑数据手动提交 数据采集模版创建后,用户可手动提交数据 数据批量导入 1、第一步:上传Excel 如何选择Excel本系统的批量导入支持选择任意相关的Excel,映射到数据采集模版的各列,即可实现批量导入;相关Excel可以是自行维护的相关数据、或从其他业务系统导出…

【C语言】文件操作 -- 详解

一、什么是文件 磁盘上的文件是文件。 1、为什么要使用文件 举个例子,当我们想实现一个 “通讯录” 程序时,在通讯录中新建联系人、删除联系人等一系列操作,此时的数据存储于内存中,程序退出后所有数据都会随之消失。为了让通讯录…

vue-admin-template实现按钮级控制

这里记录一下使用大佬的模板vue-admin-template,实现按钮级别控制 实现的思路:用户登录之后,返回用户详细信息(将用户的所有权限码发送给前端),然后将权限码保存在全局状态管理对象中,然后在组件中进行判断是否显示 最…

JAVA学习-愚见

JAVA学习-愚见 分享一下Java的学习路线,仅供参考【本人亲测,真实有效】 1、尽可能推荐较新的课程 2、大部分视频在B站上直接搜关键词就行【自学,B大的学生】 文章目录 JAVA学习-愚见前期准备Java基础课程练手项目 数据库JavaWeb前端基础 Vue…

Rancher2.5.9版本证书更新

一、环境 主机名IP地址操作系统rancher版本K8s-Master192.168.10.236Centos 72.5.9 二、更新证书 1、查看当前证书到期时间 2、进行证书轮换 [rootK8s-Master ~]# docker ps |grep rancher/rancher d581da2b7c4e rancher/rancher:v2.5.9 &q…

ARM汇编【4】:CONDITIONAL EXECUTION

我们在讨论消费品安全标准登记册时已经简要地谈到了条件的主题。我们在程序运行时使用条件来控制程序流,通常是通过跳转(分支)或仅在满足条件时执行某些指令。该条件被描述为CPSR寄存器中特定位的状态。这些比特根据一些指令的结果不时地变化…

结构体指针和结构体数组指针

结构体指针和结构体数组指针是不同的类型。 结构体指针定义&#xff1a;Student *stu 结构体指针的步长是一个结构体的大小&#xff1b; 结构体数组指针定义&#xff1a;Student (*stu)[] 结构体数组指针的步长是整个结构体数组的大小。 例程&#xff1a; #include <stdio…

机器学习理论笔记(二):数据集划分以及模型选择

文章目录 1 前言2 经验误差与过拟合3 训练集与测试集的划分方法3.1 留出法&#xff08;Hold-out&#xff09;3.2 交叉验证法&#xff08;Cross Validation&#xff09;3.3 自助法&#xff08;Bootstrap&#xff09; 4 调参与最终模型5 结语 1 前言 欢迎来到蓝色是天的机器学习…

java八股文面试[java基础]——面向对象特点

三大特点&#xff1a; 封装 继承 多态 面试题&#xff1a;java如何实现多继承&#xff08;除了使用接口之外&#xff09; 实现多继承有三个方法&#xff1a; 多层继承内部类接口 参考 java实现多继承的三种方式 多层继承 ​如果要直接继承类&#xff0c;子类是不可以直接多…

微信小程序的汽车租赁系统的l9k0e

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

开源文库系统moredoc

什么是 moredoc &#xff1f; moredoc 中文名 魔豆文库&#xff0c;是基于 golang 开发的类似百度文库、新浪爱问文库的开源文库系统&#xff0c;支持 TXT、PDF、EPUB、MOBI、Office 等格式文档的在线预览与管理&#xff0c;为 dochub 文库(github, gitee &#xff09;的重构版…

民族传统文化分享系统uniapp 微信小程序

管理员、用户可通过Android系统手机打开系统&#xff0c;注册登录后可进行管理员后端&#xff1b;首页、个人中心、用户管理、知识分类管理、知识资源管理、用户分享管理、意见反馈、系统管理&#xff0c;用户前端&#xff1b;首页、知识资源、用户分享、我的等。 本系统的使用…

初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法

初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中&#xff0c;可能会遇到一些常见问题。以下是一些常见问题以及相应的处理方法&#xff1a; 1、顶点丢失和形状变形&#xff1a;在减小顶点数量的过程中…

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 8- 完成返回 JSON 格式数据-@ResponseBody

&#x1f600;前言 自己实现 SpringMVC 底层机制 系列之-实现任务阶段 8- 完成返回 JSON 格式数据-ResponseBody &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0…

大数据风控介绍

众所周知&#xff0c;金融是数据化程度最高的行业之一&#xff0c;也是人工智能和大数据技术重要的应用领域。随着大数据收集、存储、分析和模型技术日益成熟&#xff0c;大数据技术逐渐应用到金融风控的各个环节。个推作为专业的数据智能服务商&#xff0c;拥有海量数据资源&a…

Android项目如何上传Gitee仓库

前言 最近Android项目比较多&#xff0c;我都是把Android项目上传到Gitee中去&#xff0c;GitHub的话我用的少&#xff0c;可能我还是更喜欢Gitee吧&#xff0c;毕竟Gitee仓库用起来更加方便 一. 创建Gitee仓库 1. 先创建一个Gitee账号&#xff0c;然后登录上去 2. 创建Androi…

基于JSP+Servlet+mysql养老院管理系统

基于JSPServletmysql养老院管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的养老院管理系统 [yanglaoyuan] 当前版本&#xff1a;V1.0.0版本 难度等级&#xff1a;✩✩点…

恒运资本分析:科技股有哪些股票?

跟着科技的不断进步&#xff0c;科技职业越来越遭到人们的重视。在股市中&#xff0c;出资科技股票已经成为人们赚取高额收益的一种方法。那么科技股有哪些值得出资的股票呢&#xff1f;本文将从多个角度剖析科技股。 一、美股科技股票 在美股商场中&#xff0c;科技股票一向以…

QIIME 2教程. 29补充资源SupplementaryResources(2023.5)

补充资源 Supplementary resources https://docs.qiime2.org/2023.5/supplementary-resources/ 教学内容 Educational content 以下资源对于了解有关微生物组分析和生物信息学的更多信息很有用&#xff1a; 应用生物信息学导论 An Introduction to Applied Bioinformatics http…