ClickHouse 原理:深入理解数据分片 Part 和分区 Partition

在 ClickHouse 中,磁盘上存储表数据一部分的物理文件被称为数据分片part。数据分区partition则是通过分区键创建表的数据逻辑划分。通过分区,用户可以更高效地存储、查询和操作数据的子集,从而提升大表的性能和可管理性。在本博客系列的第一篇中,我们将介绍 ClickHouse 中的数据分片 part 与分区 partition,以及它们的使用方式和区别。

1. Part

如前所述,Part是磁盘上的物理文件。默认情况下,所有与数据相关的文件都位于/var/lib/clickhouse目录下。ClickHouse 中的每个 MergeTree 表都有一个唯一目录路径来存储Part。你可以通过system.parts系统表查询到Part的实际存储位置、片段名称、分区信息(如果有的话)以及其他一些有用的信息。

下方展示了从system.parts表中查询结果的一个示例。其中,part_type字段中的Wide表示每列在文件系统中以单独的文件形式存储;而Compact则表示所有列都存储在同一个文件中。此外,在partition列中,tuple()表示该表未进行分区。

SELECTsubstr(table,1,22),partitionASprt,name,part_type,pathFROMsystem.partsWHEREdatabase='sampleDatasets'ORDERBYtableASC,partitionASC,nameASCQuery id:2a9462a8-7e74-4c0f-a89a-0bd2a31d0a46 ┌─substring(table,1,22)─┬─prt─────┬─name──────────┬─part_type─┬─path──────────────────────────────────────────────────────────────────────────────┐ │.inner_id.ca612a5e-5ee │ tuple()│ all_1_1_1 │ Compact │/var/lib/clickhouse/store/4c6/4c6dfe9a-b697-4f9a-928f-f829bf44fb5c/all_1_1_1/│ │ opensky │ tuple()│ all_1_1_1_5 │ Wide │/var/lib/clickhouse/store/1af/1afc664b-0a25-443a-a317-532532434753/all_1_1_1_5/│ │ opensky │ tuple()│ all_2_2_1_5 │ Wide │/var/lib/clickhouse/store/1af/1afc664b-0a25-443a-a317-532532434753/all_2_2_1_5/│ │ opensky │ tuple()│ all_3_3_0_5 │ Wide │/var/lib/clickhouse/store/1af/1afc664b-0a25-443a-a317-532532434753/all_3_3_0_5/│ │ opensky │ tuple()│ all_4_4_0_5 │ Compact │/var/lib/clickhouse/store/1af/1afc664b-0a25-443a-a317-532532434753/all_4_4_0_5/│ │ openskyDeletedRecord │ tuple()│ all_2_2_2 │ Compact │/var/lib/clickhouse/store/5b0/5b0e6758-ae46-4c25-9599-f2cddc362b5e/all_2_2_2/│ │ opensky_1000000 │ tuple()│ all_1_1_0 │ Wide │/var/lib/clickhouse/store/a2a/a2aa62d7-65bb-4bb2-bc5b-2c3d1befa147/all_1_1_0/│ │ opensky_freeze_restore │ tuple()│ all_1_1_1 │ Wide │/var/lib/clickhouse/store/2d0/2d0e6ad7-6fd4-408e-8c18-b39416ea8ff1/all_1_1_1/│ │ opensky_freeze_restore │ tuple()│ all_2_2_1 │ Wide │/var/lib/clickhouse/store/2d0/2d0e6ad7-6fd4-408e-8c18-b39416ea8ff1/all_2_2_1/│ │ opensky_freeze_restore │ tuple()│ all_3_3_0 │ Wide │/var/lib/clickhouse/store/2d0/2d0e6ad7-6fd4-408e-8c18-b39416ea8ff1/all_3_3_0/│ │ opensky_freeze_restore │ tuple()│ all_4_4_0 │ Compact │/var/lib/clickhouse/store/2d0/2d0e6ad7-6fd4-408e-8c18-b39416ea8ff1/all_4_4_0/│ │ opensky_redo_test │ tuple()│ all_1_2_1 │ Compact │/var/lib/clickhouse/store/e99/e99f1ab9-6d21-4d01-8f02-9f2aa0e6b45a/all_1_2_1/│ │ opensky_redo_test2 │ tuple()│ all_103_104_1 │ Compact │/var/lib/clickhouse/store/fac/facadfc3-1c5b-4775-bea7-53c262f7e237/all_103_104_1/│ │ test_table │ tuple()│ all_1_2_1 │ Compact │/var/lib/clickhouse/store/024/024a3a77-4ca9-4761-a2f1-4b36eb4ece0e/all_1_2_1/│ └─────────────────────────┴─────────┴───────────────┴───────────┴───────────────────────────────────────────────────────────────────────────────────┘

也可以在目录/var/lib/clickhouse/data/<DBNAME>/<TABLENAME>中查看表的数据分片Part,会发现该目录下存放都是符号链接,通过链接可以查看表包含的数据分片Part。比如,进入表mytest_of_ti所在目录查看:

root@clickhouse01:/var/lib/clickhouse/data/sampleDatasets/opensky# ls -al total 36 drwxr-x--- 7 clickhouse clickhouse 4096 Nov 21 10:00 . drwxr-x--- 3 clickhouse clickhouse 4096 Oct 16 13:13 .. drwxr-x--- 2 clickhouse clickhouse 4096 Nov 21 09:49 all_1_1_1_5 drwxr-x--- 2 clickhouse clickhouse 4096 Nov 21 09:49 all_2_2_1_5 drwxr-x--- 2 clickhouse clickhouse 4096 Nov 21 09:49 all_3_3_0_5 drwxr-x--- 2 clickhouse clickhouse 4096 Nov 21 09:49 all_4_4_0_5 drwxr-x--- 2 clickhouse clickhouse 4096 Nov 9 11:33 detached -rw-r----- 1 clickhouse clickhouse 1 Oct 16 13:13 format_version.txt -rw-r----- 1 clickhouse clickhouse 100 Nov 21 09:49 mutation_5.txt

如上例所示,sampleDatasets数据库中的opensky表包含 4 个数据分片Part。每个数据分片Part都有其独立的目录,且目录名称均以all_开头。以名为all_3_3_0_5的数据分片Part为例:

  • 第一个 3 表示数据分片Part所包含数据块的最小编号;
  • 第二个 3 表示数据分片Part所包含数据块的最大编号;
  • 0 表示合并层级(即数据分片Part由合并树的第几层生成);
  • 5 表示变更版本号(mutation version),用于标识数据分片Part是否经过了数据变更(mutation)操作。

此外,这些信息也可以通过system.parts系统表进行查询获取:

SELECTname,partition_id,min_block_number,max_block_number,level,data_versionFROMsystem.partsWHERE(database='sampleDatasets')AND(table='opensky')AND(name='all_3_3_0_5')Query id:0f2bb404-11a0-4df3-b1c1-7941698b9560 ┌─name────────┬─partition_id─┬─min_block_number─┬─max_block_number─┬─level─┬─data_version─┐ │ all_3_3_0_5 │all3305│ └─────────────┴──────────────┴──────────────────┴──────────────────┴───────┴──────────────┘

2. Partitions

与数据分片Part一样,也可以从system.parts表中访问 MergeTree 表的分区信息。不过,在这里分区列不是用tuple()来表示了,而是具体的分区标识。要创建一个分区表,首先需要在创建表时使用PARTITION BY expr子句。例如,PARTITION BY toYYYMMDD(start_time)子句会根据start_time列按天创建分区。在下面的示例中可以看到,Partitions 分区名称和数据分片Part名称是不同的。此外,数据分片Part名称不再以all开头,而是以对应的分区标识作为前缀。分区是一种逻辑上的划分方式,而数据分片Part则是实际存储在磁盘上的物理文件。一个分区可以包含一个或多个数据分片Part

SELECTpartition,name,activeFROMsystem.partsWHERE(table='backups')AND(database='RECMAN')┌─partition─┬─name───────────┬─active─┐ │2022101720221017_1_1_0 │1│ │2022101820221018_2_2_0 │1│ │2022111420221114_3_3_0 │1│ └───────────┴────────────────┴────────┘

通常,分区用于提升查询性能,并为我们提供灵活管理数据子集的能力。你可以直接对分区进行查询、删除(DROP)、分离(DETACH)等操作。关于数据分片Part和分区Partitions的具体操作,我们将在后续的博客文章中详细讨论。

你可以通过在WHERE子句中指定条件,或使用隐藏列_partition_id来查询特定的分区。当然,更推荐使用官方支持的方式,即在WHERE子句中直接提供分区键的条件。但在某些场景下,我们也需要使用_partition_id

现在,让我们来看一个分区表的查询示例。假设我们的表recoDB.opensky_partitioned是按lastseen列进行分区的。我们既可以通过分区键列(即lastseen),也可以通过隐藏列_partition_id来访问特定的分区:

SELECTcount()FROMrecoDB.opensky_partitionedWHEREtoDate(lastseen)='2019-02-25'┌─count()─┐ │69480│ └─────────┘#####################################SELECTcount()FROMrecoDB.opensky_partitionedWHERE_partition_id='20190225'┌─count()─┐ │69480│ └─────────┘

此外,我们还可以利用_partition_id查询前 10 个分区的数据:

SELECT_partition_id,count()FROMrecoDB.opensky_partitionedGROUPBY_partition_idORDERBY2DESCLIMIT10┌─_partition_id─┬─count()─┐ │2019052490358│ │2019053187917│ │2019052387023│ │2019053086945│ │2019042585524│ │2019051685348│ │2019051585287│ │2019052285056│ │2019051784986│ │2019051084585│ └───────────────┴─────────┘

3. 结论

数据分片Part和分区Partitions是 ClickHouse 数据库的核心组成部分。一般来说,数据分片Part用于存储表中的一部分数据,是磁盘上的物理文件;而分区Partitions则是逻辑结构,常用于提升表的查询性能和数据管理效率。在本系列的第一篇文章中,我们介绍了 ClickHouse 中的数据分片Part与分区Partitions。在后续的文章中,我们将深入探讨对它们的操作、合并(merging)以及变更(mutations)等内容。

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

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

相关文章

ClickHouse 高分笔记

1. 原理 实时数据分析数据库 ClickHouse 介绍开源OLAP引擎&#xff08;ClickHouse、Doris、Presto、ByConity&#xff09;性能对比分析ClickHouse 原理&#xff1a;如何为列式存储构建快速 UPDATE I&#xff1a;特别设计的专用引擎ClickHouse 原理&#xff1a;深入理解数据分片…

全国逛同一座城?我们都活在“复制粘贴”的模块化世界里

全国逛同一座城&#xff1f;我们都活在“复制粘贴”的模块化世界里 目录 全国逛同一座城&#xff1f;我们都活在“复制粘贴”的模块化世界里&#x1f50d; 看懂“复制粘贴”的本质&#xff1a;不是巧合&#xff0c;是底层逻辑的必然&#x1f4a1; 普通人如何透过现象看本质&…

【课程设计/毕业设计】基于springboot的助农扶贫系统家乡扶贫助农系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

微信小程序 == rsa加解密工具

wxmp-rsa 1、简介 前端rsa加解密工具。 基于jsencrypt修改扩展功能。兼容小程序环境&#xff0c;压缩后60kb左右的大小&#xff0c;节省小程序空间。支持超长文本加解密。支持中文字符的加解密。 仓库地址 https://github.com/jiayc4215/wxmp-rsa2、安装 npm i wxmp-rsa …

logging模块,scrapy全站爬取

1.longging模块 logging是python内置的日志处理模块 在scrapy中,可以配置LOG_LEVEL来设置输出的日志等级,也可以在scrapy/settin/default_setting.py 路径下查看日志相关默认参数(需要修改的参数可以直接在settings.py文件中修改) #添加日志 LOG_LEVEL="WAREING"…

CrawlSpider自动爬取,ImagePipeline

1.crawlspider自动爬取 csrapy框架在scrapy.spiders模块中提供了crawlspider类专门用来自动爬取,crawlspider类是spider的派生类,spider类的设计原则是只爬取srart_url列表中的网页,而CrawlSpider类可以定义一些规则来进行url的跟进,我们可以使用跟进的这个特性达到自动翻页…

TPDO vs RPDO 对比总结

TPDO vs RPDO 对比总结 核心本质对比 维度 TPDO RPDO 名字全称 Tx Process Data Object Rx Process Data Object 通信方向 Slave → Master (从站上传主站) Master → Slave (主站下发从站) 通信内容 状态反馈: 位置、速度、力矩等 控制指令: 目标位置、模式切换 在 RTLink 中…

贪吃蛇 set和deque使用

#include <vector> #include <string> #include <deque> #include <set>using namespace std;// 您提供的 Node 结构体 typedef struct Node{int _x;int _y;Node(int x, int y){_x x;_y y;}// 重载 < 运算符&#xff0c;方便放入 set 中进行去重/…

亲测好用8个一键生成论文工具,研究生论文写作必备!

亲测好用8个一键生成论文工具&#xff0c;研究生论文写作必备&#xff01; AI 工具助力论文写作&#xff0c;效率提升不再是梦想 在研究生阶段&#xff0c;论文写作是每位学生都无法回避的重要任务。无论是开题报告、文献综述&#xff0c;还是最终的毕业论文&#xff0c;都需要…

电力企业数字化管理升级,如何实现项目、人员、财务一体化管控?

某民企电力企业&#xff0c;是集电力设计、电力工程、电力设备、电力运维于一体的专业电力服务商&#xff0c;服务网点覆盖全国。企业人员规模500&#xff0c;项目覆盖众多乡村及城市区域&#xff0c;面临着人员、项目等多维度的管理挑战。 一、企业管理痛点 项目信息搜集低效…

轰炸敌人,最多可以摧毁的敌人城堡数目

我的解法&#xff1a; 对于每一个空位置&#xff0c;进行一次bfs&#xff0c;从上下左右四个方向去寻找&#xff0c;这是岛屿问题的相似处理&#xff0c;但是这个题可以优化&#xff0c;因为横竖方向可以进行动规优化。 我们不需要对每个 0 都重新数一遍它所在的行和列有多少敌…

汉诺塔问题及其扩展

汉诺塔问题及其扩展 : 1个基本模型很多扩展 基本模型: \(3\)个柱子,\(A,B,C\),\(a\)上有\(n\)个盘子,从上而下从小到大排好,现在要把所有盘子从\(a\)移到\(c\),要求一次只是移动一个盘子,且大的不能在小的上面,…

揭秘天猫超市购物卡回收其中的猫腻

如今,很多人手中都有闲置的天猫超市购物卡,想通过天猫超市购物卡回收变现来盘活资源,可回收过程中猫腻不少,一不留神就可能遭受损失。一、回收猫腻大起底1、二手平台风险重重行业数据显示,二手平台上购物卡回收纠…

三分之一2-5天和三分之二6-13天资金利用率对比学习

目录一、基础参数定义&#xff08;统一口径&#xff09;1. 基础仓位金额计算二、资金周转率与时间周期的数学建模1. 周期天数区间与均值2. 资金周转率定义&#xff08;单次交易&#xff09;3. 周转率差值与比例&#xff08;1&#xff09;周转率差值&#xff08;2&#xff09;周…

Spring Cloud Alibaba 2025.0.0 整合 ELK 实现日志 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android关机

adb shell reboot -p

221_尚硅谷_实现接口和继承比较(2)

221_尚硅谷_实现接口和继承比较(2)1.实现接口可以当作是对继承的一种补充 2.实现接口和继承

2026年苏州智能硬件设计公司推荐:飓风工业设计,企业产品设计/专业工业设计/产品外观设计/电子产品设计/工业设计/机械产品设计公司精选

在数字化转型浪潮中,优秀的工业设计公司正凭借数据驱动和技术融合,重新定义产品竞争力。 工业设计正经历从传统外观造型设计向技术集成运用的现代工业设计转变。 市场报告显示,全球工业设计服务市场规模持续增长,智…

2026年国内知名的投影机品牌排名,激光投影仪/20000流明投影机出租/画展投影机出租/雾幕投影机,投影机公司排行

评测背景:聚焦服务与保障,重新定义“强”的标准 随着展览展示、文旅演艺及高端会议市场的蓬勃发展,专业投影设备的需求已从单一的产品性能,扩展至包含方案设计、设备保障、现场执行与全国化服务在内的综合能力比拼…

JAVA自学之路1.1:JAVA入门纠错

1.1、JAVA入门纠错 在JAVA入门这篇文章里有些问题和错误需要纠正,懒得再改那篇文章了,直接写在这好了。 package test.test1;public class HelloWorld {public static void main(String[] args) {System.out.println…