主题
0. ClickHouse 学习路线图(施工总图)
本文档把
task.md第六节的 19 章大纲展开成可执行的施工排期表,作为后续每一章节产出的「图纸」。每一行回答四个问题:
- 这一章要让读者学会什么?
- 要写多少字才足够把概念讲透又不至于啰嗦?
- 要附上哪些可运行的实战?
- 配套的 HTML 演示页和面试题怎么落地?
0.1 为什么先做一份施工图
写一本「从 0 到 1 的 ClickHouse」教程不像写几篇博客 —— 19 章之间有强烈的依赖关系:
- 第 1 章不把「列式存储 + 向量化」讲透,第 5 章 MergeTree 的稀疏索引就没法理解。
- 第 3 章不把
LowCardinality/AggregateFunction讲清楚,第 6、10 章的SummingMergeTree和物化视图就是空中楼阁。 - 第 12 章 Mutation 不先把「ClickHouse 的 UPDATE/DELETE 是后台异步重写」讲明白,读者面试时就会拿 MySQL 的脑回路去答题。
所以我们先把全本骨架钉死:每一章的核心知识点、需要交付的代码物、面试题数量、章节字数预算,全部摊到一张表里。后续 18 个章节按表施工,避免跑题、漏点、字数失控。
总体节奏遵循「先用、再懂、最后调」:
第 1-3 章 入门三件套:是什么 / 怎么连 / 类型怎么选
第 4-6 章 核心引擎:MergeTree 家族原理与变体(教程灵魂区)
第 7-9 章 日常使用:写入读取最佳实践 / 聚合 / JOIN 与字典
第 10-12 章 进阶能力:物化视图 / TTL / Mutation
第 13-15 章 分布式与多租户:副本分片 / 集成生态 / 权限
第 16-18 章 性能与运维:调优 / 监控 / 生态扩展
第 19 章 综合实战:把前 18 章串起来做一个真实项目📌 说明:本表是「目标」而非「契约」。教程在执行过程中如发现某一章实际超过 1.5 倍预算字数,会拆章而非压缩;如果某一章不到 60% 预算,会回炉补例。所有「核心知识点」一栏的术语都是首次出现必须解释的硬性要求,不允许默认读者会。
0.2 19 章施工表
| 序号 | 章节名 | 预计字数 | 核心知识点 | 实战案例 | 演示页要点 | 面试题数量 |
|---|---|---|---|---|---|---|
| 01 | ClickHouse 是什么 & 为什么快 | 5000~7000 | OLAP vs OLTP;列存 vs 行存;向量化执行;LZ4/ZSTD/Delta 压缩;ClickHouse 历史与生态位(Doris/Druid/StarRocks/Pinot 对比) | hello_ck.py:连本地 8123,建库 learn_ck,建演示表,跑一条聚合 | 行存 vs 列存 IO 演示(可调列数);向量化批处理 1024 行动画;OLAP 数据库定位象限 | 5~8 |
| 02 | 客户端与基础 SQL | 4500~6000 | clickhouse-client / HTTP / JDBC 三种入口;库 / 表 / 视图三级结构;DDL / DML / DQL;SHOW / DESCRIBE / SYSTEM 命令族;FORMAT 全家桶;ClickHouse 与标准 SQL 的差异 | init.sql 建 events 表灌 1 万行;basic_query.py 五种常用查询模式 | HTTP 接口模拟器(输入 SQL → curl);FORMAT 全家桶预览;SYSTEM 命令速查卡 | 5 |
| 03 | 数据类型详解 | 5000~7000 | Int* / UInt* / Float* / Decimal*;String / FixedString / LowCardinality;Date / Date32 / DateTime / DateTime64;UUID / Enum / IPv4/6;Array / Tuple / Map / Nested;Nullable 的代价;AggregateFunction 与 SimpleAggregateFunction;CAST 转换族 | init.sql 建覆盖各典型类型的 type_demo 表;types_play.py 写入与查询所有类型,演示 LowCardinality 节省内存 | LowCardinality 字典编码可视化;Nullable 额外存储成本演示;Array/Map/Nested → 列存布局 | 5 |
| 04 | 表引擎全景图 | 5000~6500 | MergeTree 家族 / Log 家族 / Memory / File / URL / MySQL / PostgreSQL / Kafka / S3 / Distributed / Materialized*;引擎选型决策树 | 7 种引擎建表与对比;从 MySQL 引擎读取真实表 | 引擎家族图;选型决策流程;Kafka → MV → MergeTree 数据流动画 | 5 |
| 05 | MergeTree 核心原理(灵魂章) | 7000~9000 | Part 目录结构;primary.idx 稀疏索引;Mark 与 Granule;index_granularity = 8192;Skip Index:minmax/set/bloom_filter/ngrambf_v1;PARTITION BY / ORDER BY / PRIMARY KEY 三者关系 | 千万级造数脚本;EXPLAIN PIPELINE 跑通;对比开关 Skip Index 的扫描量 | Part 目录结构可视化;稀疏索引跳 Granule 动画;Skip Index 命中率对比 | 6 |
| 06 | MergeTree 家族进阶 | 6000~8000 | ReplacingMergeTree 去重;SummingMergeTree 预聚合;AggregatingMergeTree + AggregateFunction;CollapsingMergeTree / VersionedCollapsingMergeTree 行折叠;GraphiteMergeTree;FINAL 关键字代价 | 同一份订单数据用 4 种引擎建表;演示去重 / 折叠 / 汇总过程;FINAL 性能影响 | 后台 Merge 动画;ReplacingMergeTree 去重过程;Collapsing 行折叠演示 | 6 |
| 07 | 写入与读取最佳实践 | 5000~6500 | 批量写入;小批次的代价;async_insert;Buffer 引擎;INSERT ... SELECT;FORMAT 全家桶;max_threads / max_memory_usage | 单条 vs 批量写入耗时对比;async_insert 启用前后对比;CSV/Parquet/JSONEachRow 互转 | 写入路径全景图;async_insert 缓冲池演示;并发查询线程分配 | 5 |
| 08 | 聚合、窗口函数与数组 | 6000~7500 | GROUP BY / WITH ROLLUP / CUBE / TOTALS;HAVING;uniq* / quantile* / topK / argMax 函数族;窗口函数;ARRAY JOIN;高阶 lambda 函数 | UV / PV / 留存 / 漏斗 5 种典型查询 | 聚合函数家族图;ARRAY JOIN 展开过程;窗口函数滑动动画 | 5 |
| 09 | JOIN 与字典 | 5000~6500 | INNER/LEFT/RIGHT/FULL/CROSS/ANY/ASOF JOIN;JOIN 内存代价;GLOBAL JOIN;Dictionary 作为「右表」;字典源 mysql/postgresql/http/file | 大表 JOIN vs 字典查找耗时对比;ASOF JOIN 时序场景 | 字典加速 JOIN 动画;大表 JOIN 内存爆炸演示 | 5 |
| 10 | 物化视图与 Projection(灵魂章) | 6500~8000 | 普通视图 vs 物化视图;POPULATE 的坑;链式 MV;AggregatingMergeTree + MaterializedView 实时聚合;Projection 与 MV 的取舍 | 实时 UV 物化视图;广告漏斗 MV;Projection 加速分组查询 | MV 触发时机演示;链式 MV 数据流;Projection vs MV 选型对比 | 6 |
| 11 | TTL、分区与数据生命周期 | 4500~6000 | PARTITION BY 设计原则;TTL ... DELETE / TO VOLUME / TO DISK;冷热分层;分区裁剪;OPTIMIZE TABLE ... FINAL 代价 | 7 天明细 + 90 天聚合的分层方案;冷热分层 SSD/HDD 演示 | TTL 数据搬家动画;分区裁剪命中可视化 | 5 |
| 12 | Mutation:UPDATE / DELETE 的真相 | 4500~6000 | ALTER TABLE … UPDATE/DELETE异步重写机制;system.mutations;轻量级 DELETE;REPLACE PARTITION;为什么 ClickHouse 不适合频繁改 | 重写型 vs 轻量 DELETE 对比;REPLACE PARTITION 安全更新 | Mutation 后台重写过程;lightweight DELETE 逻辑标记演示 | 5 |
| 13 | 副本与分布式(灵魂章) | 7000~9000 | ReplicatedMergeTree + Keeper;副本同步流程;Distributed 引擎与本地表;分片键;internal_replication;读写路径全景 | 3 节点集群(mock / 单机模拟);分布式表读写演示 | 副本同步动画;fan-out/fan-in 查询执行链路 | 6 |
| 14 | 集成生态 | 4500~6000 | Kafka 引擎;MaterializedPostgreSQL;S3 / HDFS 读写;MySQL / PostgreSQL 表函数;remote() 跨集群;Airbyte / Debezium | Kafka → ClickHouse 实时摄入完整链路 | Kafka 消费动画;跨库 federation 查询演示 | 5 |
| 15 | 权限、配额与多租户 | 4000~5500 | 用户与 Profile;GRANT / REVOKE;行级 / 列级权限;Quota;max_memory_usage 等关键限制;SQL 防御性配置 | 多租户场景实操:建用户、配 quota、加行级策略 | 权限矩阵交互;quota 触发演示 | 5 |
| 16 | 性能调优与查询分析 | 6000~7500 | EXPLAIN PLAN / PIPELINE / ESTIMATE;system.query_log / system.parts / system.metrics;trace_log 与火焰图;常见慢 SQL 模式 | 5 种慢 SQL 模式 + 优化前后对比;trace_log 抓取火焰图 | 查询计划树可视化;query_log 分析仪表板 | 6 |
| 17 | 运维与可观测 | 5000~6500 | 关键 config.xml / users.xml;SYSTEM 命令族;BACKUP / RESTORE + clickhouse-backup;升级与版本兼容;Prometheus / Grafana 监控 | 一键备份 / 恢复脚本;Prometheus exporter 配置 | 监控面板示意;备份恢复流程 | 5 |
| 18 | 生态与扩展 | 4500~6000 | UDF(SQL UDF / Executable UDF);clickhouse-local 单机分析;chdb 嵌入式;与 Spark / Flink / Superset / Metabase 集成 | 注册一个 SQL UDF;用 clickhouse-local 跑 CSV;chdb in Python | UDF 调用链;clickhouse-local vs server 对比 | 5 |
| 19 | 综合实战项目 | 8000~10000 | 选题:实时埋点分析平台;从建模 → 摄入 → 物化视图 → 查询 → 看板,全链路打通 | 完整项目(造数 + 建表 + Kafka 接入 + MV + 仪表板) | 全链路动画;端到端延迟分解 | 5 |
字数小计:约 10.7 万 ~ 14.5 万字(不含代码)。按每天 6000 字推进,约 18~24 个工作日完成正文;演示页与代码并行产出。
面试题小计:约 100 题,最终汇总到 interview.md。
0.3 灵魂章节优先级
按 task.md 第八节的优先级建议:
| 优先级 | 章节 | 理由 |
|---|---|---|
| ⭐⭐⭐ | 第 1 章 ClickHouse 是什么 | 决定读者「学不学得下去」的第一印象,所有后续概念都要在这里铺垫 |
| ⭐⭐⭐ | 第 5 章 MergeTree 核心原理 | ClickHouse 灵魂,没有它整本书就只是一本 SQL 手册 |
| ⭐⭐⭐ | 第 6 章 MergeTree 家族进阶 | 大量「面试杀手题」(FINAL / Replacing 去重时机)都在这里 |
| ⭐⭐⭐ | 第 10 章 物化视图与 Projection | 真正把 ClickHouse 用到「实时数仓」高度的关键能力 |
| ⭐⭐⭐ | 第 13 章 副本与分布式 | 生产环境必须,分布式 SQL 的 fan-out / fan-in 是大数据面试常考点 |
| ⭐⭐ | 第 3 章数据类型 / 第 9 章 JOIN 与字典 / 第 16 章性能调优 | 日常使用与调优的根基 |
| ⭐ | 其余章节 | 保持节奏,不深挖不水文 |
0.4 通用写作约束(与 task.md 对齐)
- 每章四件套缺一不可:
.md正文 +demo.html演示页 + 实战代码(code/*.py/init.sql/seed.py)+## 面试高频题小节。 - 首次术语必解释:所有第一次出现的术语都要先用一段话「先讲是什么」再用。
- 生活化类比 + ASCII 图 + Mermaid 图三件武器:晦涩点必须先打比方,再上图。
- 代码可复制即用:所有 SQL / Python / HTML 都假设 ClickHouse 已经在
127.0.0.1:8123跑着,读者复制即可执行。 - 面试题统一格式:题目 / 考察点 / 标准答案 / 加分项 / 易错点 / 与 MySQL/PG(或同类 OLAP)对比。
- 性能结论必须可复现:写明数据量 / 机器规格 / SQL,并以
system.query_log的客观指标对比。 - HTML 演示页深色科技风:主色用 ClickHouse 黄
#fbff37+ 紫蓝#5a64ea,参考 Postgre 教程 demo 的卡片化布局。
0.5 章节交付物清单(路径全部相对 learnNote/clickhouse/)
learnNote/clickhouse/
├── 0_learn_plan.md # 本文件
├── README.md # 教程入口
├── docker-compose.yml # 一键起 ClickHouse + Keeper
├── requirements.txt # Python 依赖
│
├── 01_intro.md
├── 01_intro/
│ ├── demo.html # 行存 vs 列存 / 向量化 / OLAP 象限
│ └── code/
│ └── hello_ck.py
│
├── 02_client_basic.md
├── 02_client_basic/
│ ├── demo.html # HTTP 接口 / FORMAT / SYSTEM 速查
│ ├── init.sql
│ └── code/
│ └── basic_query.py
│
├── 03_data_types.md
├── 03_data_types/
│ ├── demo.html # LowCardinality / Nullable / Array
│ ├── init.sql
│ └── code/
│ └── types_play.py
│
├── 04_engines.md ~ 19_project.md # 后续章节
├── interview.md # 面试题总索引
├── appendix_cheatsheet.md # 常用命令 / 函数速查
├── appendix_ck_vs_mysql.md # 与 MySQL/PG 对比速查
└── appendix_pitfalls.md # 踩坑案例集📌 下一步:按表格执行第 1 章。第 1 章是「门面章」,必须把列式存储、向量化、压缩三大法宝讲透;不达标 → 回炉重写。