ClickHouse的Partition和Part概念

一、ClickHouse 表的数据存储层次

可以用一句话总结:

数据表 → 分区(Partition) → 数据分片(Part) → 数据文件。

也就是说:

一个表有多个「分区」,

每个分区下有若干个「part」,

每个 part 由多种文件组成(列文件、索引文件、校验、元数据等)。

二、分区(Partition)

🧩 1️⃣ 定义

分区是 ClickHouse 管理数据的逻辑分组,通过建表语句中的

PARTITION BY

语句定义。

示例:

CREATE TABLE events (

event_date Date,

user_id UInt32,

action String

)

ENGINE = MergeTree()

PARTITION BY toYYYYMM(event_date) -- <== 定义分区规则

ORDER BY (user_id, event_date);

这表示表中的数据将根据 event_date 的年月来分区,即:

202407 的数据会放在一个分区,

202408 的数据放在另一个分区。

🧱 2️⃣ 特点与作用

特性 说明

逻辑分组 用来对数据进行按时间或业务字段的划分

存储隔离 每个分区的数据在磁盘上是独立目录

管理粒度 可以删除或移动整个分区

查询加速 查询时智能裁剪不相关的分区,加快速度

📦 3️⃣ 分区示例(存储路径)

在磁盘上类似:

/var/lib/clickhouse/data/db_name/table_name/

├── 202407/

│ ├── 20240701_20240701_1_1_0/

│ ├── 20240702_20240702_2_2_0/

│ └── ...

├── 202408/

│ ├── 20240801_20240801_1_1_0/

│ └── ...

202407、202408 是分区名,目录下每个子目录就是一个 part。

三、Part(数据分片)

🧩 1️⃣ 定义

part 是分区下的物理数据块,每次插入(INSERT)都会生成一个新的 part(一个目录)。

例如:

20240701_20240701_1_1_0/

20240701_20240701_2_2_0/

每个 part 里包含了数据文件,比如:

primary.idx

columns.txt

checksums.txt

count.txt

data.bin

⚙️ 2️⃣ Part 的意义:

项目 说明

存储单元 表的最小物理数据单元

生成机制 每次批量插入都会生成一个新 part

合并机制 后台会自动把多个小 part 合并成一个大 part(Merge)

删除机制 删除分区或 TTL 到期会删除对应 part

查询机制 查询时会扫描多个活跃的 part 数据文件

四、分区 vs Part 的关系

对比项 分区(Partition) Part(数据分片)

层级 上层逻辑分组 分区内的物理文件块

定义时机 建表时由 PARTITION BY 决定 每次 INSERT 或 MERGE 生成

数量 分区通常按天/月/字段生成 一个分区下可能有成百上千个 part

作用 控制数据逻辑范围(生命周期、清理策略) 控制存储与读写性能

存储位置 /data/db/table/分区名/ /data/db/table/分区名/part目录/

管理命令 ALTER TABLE DROP PARTITION, DETACH PARTITION ALTER TABLE DROP PART

典型问题 太多分区会影响管理 太多小 part 会影响性能

五、举例说明

建表并按月分区:

CREATE TABLE user_logs

(

dt Date,

uid UInt64,

msg String

)

ENGINE = MergeTree()

PARTITION BY toYYYYMM(dt)

ORDER BY (uid, dt);

你每天往表中插入一次数据,那:

每个月会有一个分区,例如 202407;

每天插入一次,就会在分区 202407 下产生一个 part;

如果每天批量插入次数多,比如每分钟插入一次,就会产生成千上万个 part。

六、如何查看分区和 part 信息

查看分区

SELECT

table,

partition,

count() AS parts,

sum(rows) AS total_rows

FROM system.parts

WHERE table = 'user_logs' AND active = 1

GROUP BY table, partition;

查看所有 part 详情

SELECT

table,

partition,

name AS part_name,

active,

rows,

bytes_on_disk

FROM system.parts

WHERE table = 'user_logs';

七、总结对比

项目 分区 (Partition) 数据分片 (Part)

含义 表的逻辑划分 表的物理存储单元

来源 PARTITION BY 决定 INSERT 或合并产生

生命周期 可整体删除、移动 被合并、删除后消失

数量 一般较少(月/天) 可能很多(成百上千)

优化重点 合理分区粒度 控制小 part 数量

查看系统表 system.parts system.parts

换句话说:

分区(Partition) = 逻辑上的"一组数据"

Part(数据分片) = 存储这一组数据的若干文件块。

一个分区下面有很多个 part,ClickHouse 后台会不断合并这些 part 来保持性能。

相关推荐
物理与数学2 小时前
linux内核 Multi-Gen LRU 算法
linux·linux内核
GZ_TOGOGO2 小时前
Oracle数据库考试适合哪些人
数据库·oracle·数据库开发·ocp认证·2026年it学习
Gauss松鼠会2 小时前
【openGauss】学习 gsql 命令行的使用
数据库·sql·database·opengauss
晓13132 小时前
第二章:Redis常见命令与Java客户端
java·数据库·redis
·云扬·2 小时前
MySQL索引实战指南:添加场景、联合索引要点与失效场景解析
数据库·mysql
填满你的记忆2 小时前
【从零开始——Redis 进化日志|Day7】双写一致性难题:数据库与缓存如何不再“打架”?(附 Canal/读写锁实战)
java·数据库·redis·缓存·面试
小白考证进阶中2 小时前
MySQL OCP认证可以考中文?备考难度怎么样?
数据库·mysql·dba·数据库管理·开闭原则·数据库管理员·mysql认证
强风7942 小时前
Linux-线程的同步与互斥
linux·服务器
提伯斯6462 小时前
Orangepi R1内置了哪些网卡驱动?(全志H3的板子)
linux·网络·wifi·全志h3