在掌握了 ClickHouse 的基础表引擎(如 MergeTree)之后,进一步深入研究其高级参数和功能,是提升性能、优化存储、实现自动化管理的关键。本篇将深入探讨 MergeTree 系列引擎的进阶参数,重点讲解:
TTL:数据生命周期管理index_granularity:索引粒度控制- 以及相关的参数如
merge_with_ttl_timeout、sampling_key等
🔍 MergeTree 表引擎进阶参数详解
1. TTL —— 数据生命周期(Time To Live)
✅ 是什么?
TTL 允许你为数据设置“过期时间”,自动删除或移动数据,适用于日志、监控等时效性强的数据。
✅ 语法格式
TTL 时间表达式 [DELETE|TO DISK 'disk_name'|TO VOLUME 'volume_name']
✅ 使用场景与示例
(1) 自动删除过期数据(如保留 30 天)
CREATE TABLE user_log (
user_id UInt32,
event_time DateTime,
action String
) ENGINE = MergeTree()
ORDER BY (user_id, event_time)
TTL event_time + INTERVAL 30 DAY;
效果:
event_time超过 30 天的数据会被后台任务自动删除。
(2) 数据分层存储:热数据在 SSD,冷数据迁移到 HDD
-- 先定义磁盘和卷(在 config.xml 中)
-- <storage_configuration>
-- <disks>
-- <ssd>...<path>/var/lib/clickhouse/ssd/</path>...</ssd>
-- <hdd>...<path>/var/lib/clickhouse/hdd/</path>...</hdd>
-- </disks>
-- </storage_configuration>
CREATE TABLE log_archive (
event_time DateTime,
data String
) ENGINE = MergeTree()
ORDER BY event_time
TTL event_time + INTERVAL 7 DAY TO DISK 'hdd',
event_time + INTERVAL 365 DAY DELETE;
效果:
- 7 天后数据从 SSD 迁移到 HDD;
- 365 天后数据被删除。
(3) 支持多条件 TTL
TTL
event_time + INTERVAL 1 MONTH TO VOLUME 'fast_volume',
event_time + INTERVAL 1 YEAR DELETE;
✅ 注意事项
- TTL 是异步执行的,由后台合并任务触发。
- 可通过
optimize手动触发:OPTIMIZE TABLE user_log FINAL; - TTL 列必须是
Date或DateTime类型。 - TTL 对
MergeTree和ReplicatedMergeTree都有效。
✅ 监控 TTL
查看 parts 的 TTL 信息:
SELECT
name,
part_type,
modification_time,
remove_time
FROM system.parts
WHERE database = 'default' AND table = 'user_log' AND remove_time IS NOT NULL;
2. index_granularity —— 稀疏索引粒度
✅ 是什么?
控制 稀疏索引的间隔,即每多少行建立一个“标记”(mark),用于快速跳过数据块。
- 默认值:8192 行(v20 之前是 8192,之后引入自适应粒度)
- 实际值可能动态调整(见下文)
✅ 语法(在建表时指定)
CREATE TABLE indexed_table (
ts DateTime,
value Float64
) ENGINE = MergeTree()
ORDER BY ts
SETTINGS index_granularity = 16384;
✅ 影响
| 粒度大小 | 优点 | 缺点 |
|---|---|---|
| 小(如 1024) | 索引更密,查询精度高,跳过更精准 | 索引体积大,内存占用高 |
| 大(如 16384) | 索引小,内存友好 | 可能多扫描一些无关数据 |
✅ 自适应粒度(Adaptive Granularity)
从 ClickHouse v20 开始,默认启用 自适应索引粒度:
- 实际粒度不再是固定值,而是根据 数据压缩块大小 动态调整。
- 每个压缩块约 64KB~1MB,确保每个 “granule”(数据块)包含一个压缩块。
- 设置方式:
SETTINGS index_granularity = 8192, -- 基准值 index_granularity_bytes = 1048576; -- 1MB,启用自适应
✅ 推荐保持默认(即启用自适应),除非有特殊需求。
✅ 如何查看实际粒度?
SELECT
database,
table,
name AS part_name,
rows,
marks -- 索引标记数量 ≈ rows / index_granularity
FROM system.parts
WHERE database = 'default' AND table = 'indexed_table';
3. merge_with_ttl_timeout —— TTL 合并频率控制
✅ 是什么?
控制 TTL 删除任务的执行间隔(单位:秒),避免频繁合并影响性能。
✅ 默认值
86400秒(即 1 天)
✅ 修改示例
CREATE TABLE ttl_table (...)
ENGINE = MergeTree()
ORDER BY key
TTL event_time + INTERVAL 30 DAY
SETTINGS merge_with_ttl_timeout = 3600; -- 每小时检查一次 TTL
⚠️ 注意:设置太小会导致频繁合并,增加 I/O 压力;太大则删除延迟高。
4. sampling_key —— 采样键(用于近似查询)
✅ 是什么?
允许使用 SAMPLE 子句进行近似查询,适用于超大数据集的快速统计。
✅ 示例
CREATE TABLE sampled_events (
user_id UInt64,
event_type String,
ts DateTime
) ENGINE = MergeTree()
ORDER BY (event_type, intHash64(user_id))
SAMPLE BY intHash64(user_id); -- 指定采样键
✅ 查询时使用采样
-- 查询 1% 的样本数据
SELECT count(*) FROM sampled_events SAMPLE 0.01 WHERE event_type = 'click';
✅ 优势:速度极快,适合“估算”而非精确结果。
🔍 要求:
SAMPLE BY的表达式必须包含在ORDER BY中。
5. enable_mixed_granularity_parts —— 混合粒度支持
✅ 是什么?
是否允许同一个表中不同 parts 使用不同的 index_granularity。
- 默认:
1(开启) - 如果关闭,所有 parts 必须使用相同粒度。
✅ 一般无需修改,保持默认即可。
🧩 其他实用 SETTINGS 参数
| 参数 | 说明 |
|---|---|
ratio_of_defaults_for_sparse_serialization | 控制稀疏序列化(节省空间) |
min_rows_for_wide_part | 小于该行数使用“紧凑存储”,否则“宽存储” |
merge_tree_uniform_read_distribution | 优化并行读取 |
ttl_only_drop_parts | 是否只删除整个 part 来加速 TTL 删除(实验性) |
📊 实际调优建议:如何选择参数?
| 场景 | 推荐配置 |
|---|---|
| 日志类数据,保留 7 天 | TTL event_time + INTERVAL 7 DAY |
| 冷热分层存储 | TTL ... TO DISK 'hdd' |
| 高频写入小数据 | 启用自适应粒度(默认) |
| 需要快速采样分析 | 使用 SAMPLE BY intHash64(user_id) |
| 避免 TTL 合并太频繁 | merge_with_ttl_timeout = 3600~86400 |
| 极端性能要求 | 调整 index_granularity 为 4096 或 16384 测试 |
🔍 查看表的 SETTINGS
SHOW CREATE TABLE your_table;
-- 或查询 system.tables
SELECT
name,
engine,
metadata_modification_time,
engine_full
FROM system.tables
WHERE database = 'default' AND name = 'your_table';
✅ 总结:MergeTree 进阶参数核心要点
| 参数 | 作用 | 推荐值 |
|---|---|---|
TTL | 自动过期、删除、迁移数据 | 按业务需求设置 |
index_granularity | 稀疏索引粒度 | 默认 8192,建议启用自适应 |
index_granularity_bytes | 控制压缩块大小(启用自适应) | 1048576(1MB) |
merge_with_ttl_timeout | TTL 合并频率 | 3600 ~ 86400 |
SAMPLE BY | 支持采样查询 | intHash64(key) |
PARTITION BY + TTL | 高效删除整分区 | 如 toYYYYMM(date) |
🎯 最佳实践口诀
“TTL 管寿命,granularity 控索引,
分区删得快,采样查得准,
合并别太频,存储要分层。”
掌握这些进阶参数,你就可以:
- 实现自动化数据生命周期管理
- 优化查询性能与存储成本
- 构建高效的冷热数据分层架构
- 支持大规模近似查询
5412

被折叠的 条评论
为什么被折叠?



