OLTP 与 OLAP 的区别
MySQL 这类面向业务事务的库叫 OLTP(在线事务处理):擅长单条增删改查、保证事务一致。而报表分析这类"对亿万行数据做分组聚合"的场景叫 OLAP(在线分析处理):一次扫描几百万行、算出"每天的销售额",要求读得极快。OLTP 库做这类分析会跑不动,ClickHouse 就是为 OLAP 而生的列式分析数据库。
一句话:业务交易用 MySQL,海量数据分析用 ClickHouse。日志分析、用户行为统计、BI 报表,都是它的主场。
- 列式存储按列存数据,分析时只读需要的列。
- MergeTreeClickHouse 的主流表引擎。
- 稀疏索引配合分区,跳过大批不相关数据。
- 超快聚合亿级数据分组统计秒出。
列式存储为什么快
传统数据库按行存:一行的所有字段挨在一起。分析查询"统计所有行的金额总和"时,按行存要把整行都读出来、只取其中金额列,浪费大量 IO。列式存储把同一列的值挨在一起,算金额总和只需读金额这一列,其他列完全不碰。再加上同一列数据类型一致、压缩率极高,扫描速度比行存快几个数量级——这就是 ClickHouse 亿级数据秒查的底气。
MergeTree 表引擎
ClickHouse 有很多表引擎,MergeTree 系列是最常用的主力:数据先按批次写入、后台再合并成有序的大文件(这也是"合并树"名字的由来)。它支持主键排序、稀疏索引、数据分区,兼顾写入吞吐与查询性能。建表时要指定 ORDER BY(排序键)和分区键,这直接决定查询快不快。
建表与写入
建一张 MergeTree 表,指定排序键与分区。写入用批量插入(不要一条一条写,ClickHouse 为批量设计),数据一般从业务库或日志流批量同步进来。
CREATE TABLE event_log (
ts DateTime,
user_id UInt64,
event String,
duration UInt32
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(ts) -- 按月分区
ORDER BY (ts, user_id); -- 排序键
-- 批量写入
INSERT INTO event_log VALUES
('2026-10-14 10:00:00', 1001, 'click', 120),
('2026-10-14 10:00:01', 1002, 'view', 350);
查询:分组与聚合
查询语法和标准 SQL 接近,强项是分组聚合。比如统计每天各事件的次数与平均时长,亿级数据也能秒回。ClickHouse 还提供大量聚合函数(uniq 近似去重、quantile 分位数等),适合分析场景。
SELECT
toDate(ts) AS day,
event,
count() AS cnt,
avg(duration) AS avg_dur
FROM event_log
WHERE ts >= '2026-10-01'
GROUP BY day, event
ORDER BY day;
稀疏索引与分区
ClickHouse 不用传统数据库那种稠密索引,而是稀疏索引:每隔一段数据记一个标记,查询时先跳过不相关的大块数据。配合分区键(比如按月分区),查某个月的数据时完全不碰其他月的文件。分区键和排序键设计得当,是 ClickHouse 查询快的关键——这也是它和 OLTP 库最大的设计差异。
什么场景该用
适合:日志分析、行为埋点统计、BI 报表、大流量监控指标的海量聚合。不适合:频繁单行更新删除(MergeTree 不擅长)、强事务、点查单条记录的高并发业务——这些还是留给 MySQL。ClickHouse 是分析库,不是业务库,两者通常配合:业务数据写 MySQL,同步一份到 ClickHouse 做分析。
入门清单
ClickHouse 入门清单:
- 分清 OLTP 与 OLAP,分析场景才用它。
- 建表定好 ORDER BY 排序键与分区键。
- 批量写入,别一条条插。
- 善用分区裁剪,让查询跳过无关数据。
- 不当业务库用,与 MySQL 配合做分析副本。
ClickHouse 代表了"为分析而生"的数据库思路:用列式存储 + 稀疏索引 + 向量化执行,把海量扫描的成本压到极低。当你的业务开始被报表、日志、行为分析的查询拖慢时,它就是那个把分析从小时级拉到秒级的工具。