ClickHouse 是什么
ClickHouse 是列式存储、向量化执行的 OLAP 数据库,单机就能跑出很高的扫描吞吐,因此常用于日志分析、行为明细与宽表聚合。它的索引是稀疏主键索引:数据按排序键有序存放,每隔若干行取一条标记,查询时先定位到数据块再在块内扫描。它不追求完整的关系库语义,多表 JOIN 与高频按主键更新都不是强项。
基本信息
| 存储 | 列式存储,按列压缩与扫描 |
|---|---|
| 执行 | 向量化执行,按数据块批处理 |
| 索引 | 稀疏主键索引,配合分区与跳数索引 |
| 典型场景 | 明细聚合、日志分析、宽表指标 |
| 常用引擎 | MergeTree 家族,去重场景用 ReplacingMergeTree |
典型使用场景
- 日志与埋点分析:单表大宽表,按时间过滤后做聚合
- 行为明细即席查询:列存加向量化,扫描大量列也很快
- 替代部分预聚合:直接在明细上算也能秒级返回,少维护一套汇总表
- 宽表指标计算:建模时先把维度关联进宽表,避开多表 JOIN
- 批量导入后分析:按月分区写入,查询带时间条件即可裁剪
建表与查询
建表与查询
CREATE TABLE dw.trade_order
(
dt Date, -- 分区字段:按时间过滤
order_id String,
store_id String,
pay_amt Decimal(18, 2)
)
ENGINE = MergeTree -- 最常用的表引擎
PARTITION BY toYYYYMM(dt) -- 按月分区
ORDER BY (store_id, dt); -- 排序键,决定稀疏索引与裁剪效果
SELECT store_id, sum(pay_amt)
FROM dw.trade_order WHERE dt = '2026-10-13'
GROUP BY store_id; -- 查询带时间条件才能裁剪分区建表要素
| 要素 | 作用 | 经验 |
|---|---|---|
| ENGINE | 决定数据合并与去重行为 | 明细用 MergeTree,按主键去重用 ReplacingMergeTree |
| PARTITION BY | 划分数据目录,便于裁剪与批量清理 | 常用按月分区,避免分区数过多 |
| ORDER BY | 排序键,决定稀疏索引的粒度 | 把最常用于过滤的列放在前面 |
| 主键与索引 | 稀疏索引按排序键隔行取样 | 过滤命中排序键前缀时裁剪效果最好 |
ClickHouse 更适合宽表聚合:多表 JOIN 的能力与关系库不同,建模时常见做法是把维度预先关联进宽表,用更高的存储冗余换取更稳定的查询性能。
ClickHouse 的删除与更新是异步的变更操作,不适合当作需要频繁按主键更新的业务库使用;这类需求应换用支持实时更新的表引擎或其他数据库。