OLTP 与 OLAP 的区别

MySQL 这类面向业务事务的库叫 OLTP(在线事务处理):擅长单条增删改查、保证事务一致。而报表分析这类"对亿万行数据做分组聚合"的场景叫 OLAP(在线分析处理):一次扫描几百万行、算出"每天的销售额",要求读得极快。OLTP 库做这类分析会跑不动,ClickHouse 就是为 OLAP 而生的列式分析数据库。

一句话:业务交易用 MySQL,海量数据分析用 ClickHouse。日志分析、用户行为统计、BI 报表,都是它的主场。

本文核心知识点
  • 列式存储按列存数据,分析时只读需要的列。
  • MergeTreeClickHouse 的主流表引擎。
  • 稀疏索引配合分区,跳过大批不相关数据。
  • 超快聚合亿级数据分组统计秒出。
OLAP 数据仓库配图:蓝色渐变背景上左侧竖直多列数据方块组成列式存储栈,中央闪电划过查询路径,右侧仪表盘上升柱状图
列式数据栈 + 闪电查询 + 上升曲线,正是 OLAP 的画面。

列式存储为什么快

传统数据库按行存:一行的所有字段挨在一起。分析查询"统计所有行的金额总和"时,按行存要把整行都读出来、只取其中金额列,浪费大量 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 库最大的设计差异。