返回首页
⚙️ 后端 / 架构

ClickHouse 实战:亿级数据秒级查询的 OLAP 方案

ClickHouse 是开源 OLAP 数据库的事实标准。本文演示从 0 到亿级数据的完整实战。

ClickHouse · OLAP · 大数据 · 后端
📰

今日技术简讯

📰 技术简讯 · 2026-05-11

今日聚合 6 条热门技术内容。

🤖 AI / LLM

1. Mistral Codestral 25B 发布

🎨 前端 / Web

2. Astro 5 推出 Server Islands

⚙️ 后端 / 架构

3. ClickHouse 实战

4. Apache Kafka 4.0 KRaft

🚀 独立开发 / OPC

5. Payhip 推出订阅功能

6. Carrd 推出会员系统


数据来源:掘金 / InfoQ 中文 / HN / GitHub / Dev.to 采集时间:2026-05-11 09:00 (UTC+8)

📝

今日深度文

ClickHouse 实战:亿级数据秒级查询的 OLAP 方案

一句话结论:ClickHouse 让"分析亿级数据"从几小时变成几秒。对数据团队来说是质的飞跃。

背景

ClickHouse 是 Yandex 开源的 OLAP 列式数据库:

  • 单机每秒处理数亿行
  • SQL 兼容(MySQL 协议)
  • 向量引擎 + 压缩存储
  • 集群水平扩展

到 2026 年,ClickHouse 已成为:

  • Uber / Cloudflare / eBay 等大厂生产环境
  • 开源 OLAP 的事实标准

5 个核心优势

1. 列式存储

行式存储(PostgreSQL):
[id=1, name='A', price=100]
[id=2, name='B', price=200]
[id=3, name='C', price=300]

列式存储(ClickHouse):
id:   [1, 2, 3]
name: ['A', 'B', 'C']
price: [100, 200, 300]

优势:聚合查询只需读 price 列(1/3 数据)

2. 向量化执行

CPU SIMD 指令一次处理多个数据
PostgreSQL: 1 row / cycle
ClickHouse: 1000 rows / cycle

3. 高压缩率

原始 CSV (10GB) → ClickHouse (800MB)
压缩比 12:1,查询更快(少读 IO)

4. SQL 兼容

-- 熟悉的 SQL 语法
SELECT
    user_id,
    count() AS events,
    avg(latency_ms) AS avg_latency
FROM events
WHERE event_date >= '2026-05-01'
GROUP BY user_id
ORDER BY events DESC
LIMIT 10;

5. 实时插入

INSERT INTO events VALUES (..., now(), ...);
-- 立即可查

实战:部署 + 数据建模

安装(Docker)

docker run -d --name clickhouse \
  -p 8123:8123 -p 9000:9000 \
  -e CLICKHOUSE_DB=default \
  -e CLICKHOUSE_USER=admin \
  -e CLICKHOUSE_PASSWORD=secret \
  -v clickhouse_data:/var/lib/clickhouse \
  clickhouse/clickhouse-server:24.5

表设计

CREATE TABLE events (
    event_date Date,
    event_time DateTime,
    user_id UInt64,
    event_type LowCardinality(String),
    page_url String,
    latency_ms UInt32,
    country LowCardinality(String),
    device LowCardinality(String)
) ENGINE = MergeTree
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, user_id)
TTL event_date + INTERVAL 90 DAY;  -- 90 天后自动删除

写入数据

from clickhouse_driver import Client

client = Client('localhost', password='secret')

# 批量插入
data = [
    (event_date, event_time, user_id, event_type, page_url, latency, country, device)
    for ... in events
]
client.execute(
    "INSERT INTO events VALUES",
    data,
)

典型查询

-- 1. DAU 统计
SELECT
    event_date,
    uniqExact(user_id) AS dau
FROM events
WHERE event_date >= today() - 30
GROUP BY event_date
ORDER BY event_date;

-- 2. 漏斗分析
SELECT
    countIf(event_type = 'view') AS views,
    countIf(event_type = 'click') AS clicks,
    countIf(event_type = 'purchase') AS purchases,
    round(click / view * 100, 2) AS click_rate,
    round(purchase / click * 100, 2) AS purchase_rate
FROM events
WHERE event_date = today();

-- 3. 用户行为路径
SELECT
    user_id,
    groupArray(event_type) AS path,
    count() AS steps
FROM events
WHERE event_date >= today() - 7
GROUP BY user_id
HAVING steps > 10
LIMIT 100;

性能基准

测试:10 亿行 events 表

| 操作 | PostgreSQL | ClickHouse |
|------|-----------|-----------|
| 全表 COUNT | 240s | 0.5s |
| 单日聚合 | 18s | 0.05s |
| 复杂 JOIN | 60s | 1.2s |
| 存储占用 | 800GB | 65GB |

ClickHouse 在分析场景下快 100-500 倍

5 个常见坑

坑 1:主键选择错误

-- ❌ 错误:随机 UUID 作为排序键
ORDER BY user_id

-- ✅ 正确:查询模式对齐
ORDER BY (event_date, user_id)

坑 2:过度使用 JOIN

-- ClickHouse JOIN 性能差
-- ✅ 用预聚合表代替

坑 3:忽略分区

-- 不分区 → 全表扫描慢
-- ✅ 按时间分区 + 排序键
PARTITION BY toYYYYMM(date)

坑 4:数据倾斜

-- 某个 user_id 数据过多
-- ✅ 用 Sampling 抽样查询
SELECT ... FROM events SAMPLE 0.1

坑 5:内存不足

# ClickHouse 默认内存占用大
# ✅ 单节点限制 max_memory_usage

何时用 ClickHouse

场景 推荐
实时分析(秒级响应)
日志聚合 + 查询
用户行为分析
OLAP 报表
高并发写入(>10K QPS) ⚠️
单行事务
单表 < 100MB ❌(用 SQLite)

我的看法

ClickHouse 是 2026 年 OLAP 的事实标准:

  1. 性能极强(比 PG 快 100x)
  2. SQL 友好(学习曲线低)
  3. 运维成本可控(vs Snowflake / BigQuery)

对独立开发者的意义:

  • 自建实时分析(替代 GA / Mixpanel)
  • 自建用户行为分析(埋点 + 即时查询)
  • 自建 BI 报表

参考


本文基于 ClickHouse 24.5 LTS,2026 年 5 月最新版本。

📚 同主题文章

⚙️ 后端 / 架构 分类更多