主题
从 0 到 1 学习 ClickHouse
一、项目目标
打造一套适合零基础小白入门、同时覆盖底层原理与面试高频考点的 ClickHouse 学习教程。要求内容由浅入深、图文并茂、能动手实操,最终达到「看完会用、用了懂原理、面试能答上」的效果。
与 MySQL / PostgreSQL / Redis 教程的差异化定位:
- 强调「OLAP 而非 OLTP」:ClickHouse 不是用来替代 MySQL 处理订单交易的,它是用来对亿级以上数据做秒级聚合分析的。讲解时要时刻提醒读者它的「能干什么、不能干什么」。
- 强调「列式存储 + 向量化执行」:这是 ClickHouse 与 MySQL/PG 在物理存储与执行模型上的根本区别,必须用图解把「行存 vs 列存」「逐行 vs 向量化」讲透。
- 强调「MergeTree 引擎家族」:MergeTree 是 ClickHouse 的灵魂,所有性能、去重、聚合、物化视图、TTL、副本都建立在它之上,必须作为重点章节展开。
- 强调「数仓视角」:要把 ClickHouse 放到「实时数仓 / Lakehouse / OLAP 大家族(Doris / Druid / StarRocks / Pinot)」中比较,让读者理解它的生态位。
二、读者画像
- 主要受众:从未接触过 ClickHouse 的初学者,可能用过 MySQL / PostgreSQL,但对列存、向量化、Part / Mark / Granule、MergeTree 合并机制一无所知。
- 次要受众:用过 ClickHouse 但停留在
select count(*)层面,希望系统化补齐底层原理(存储格式、Merge 过程、副本与分片、物化视图、Projection)的开发者;以及准备数据 / 数仓 / 大数据方向面试的同学。 - 风格要求:能用「Excel 按列复制」「图书馆按主题分书架」「快递分拣中心合并小包裹」「日记本每天追加一页」这类生活化的比喻讲清楚列式存储、Part 合并、稀疏索引、物化视图、分布式查询等晦涩概念。
三、环境约定
- 服务端无需读者自己安装:教程默认环境中已经有可用的 ClickHouse Server(本地
127.0.0.1:9000TCP /8123HTTP,或容器化均可),文档不再花篇幅讲安装。 - 默认账号 / 库:示例统一使用
default用户连接,演示数据库统一命名为learn_ck,由各章节按需建表,不污染默认库。 - 统一客户端:所有交互式示例使用
clickhouse-client,编程示例统一使用 Pythonclickhouse-connect(HTTP)或clickhouse-driver(TCP),全教程保持一致。 - 聚焦点:
- ClickHouse 的正确使用姿势(SQL 方言、表引擎选择、数据类型、写入姿势、聚合 / 窗口函数、物化视图、字典)。
- ClickHouse 的底层实现逻辑(列式存储格式、稀疏主键索引、MergeTree 合并、副本与分片、向量化执行、查询计划)。
四、章节内容物(每个章节都必须包含以下 4 部分)
每个章节按照统一结构产出,缺一不可:
学习文档(
.md)- 用「概念 → 生活类比 → SQL/代码示例 → 底层原理 → 与 MySQL/PG 对比 → 小结」六段式组织。
- 大量使用 ASCII 图 / Mermaid 图 展示列式存储布局、Part 目录结构、Mark 与 Granule 关系、MergeTree 合并过程、分布式查询执行链路,避免纯文字堆砌。
- 关键 SQL 必须给出
clickhouse-client实操记录(输入 + 输出 + 耗时),并在性能相关章节配上EXPLAIN PIPELINE/EXPLAIN PLAN/system.query_log的真实分析。
实战案例(可运行代码)
- 至少 1 个贴近真实业务的场景,例如:网站埋点 PV/UV 实时统计、广告点击漏斗分析、日志大宽表查询、用户行为路径分析、IoT 时序数据聚合、A/B 实验指标看板、实时大屏 Top-N 排行榜等。
- 给出完整可运行的代码(推荐 Python
clickhouse-connect一以贯之),附带docker-compose.yml(如需)、初始化 SQL 脚本init.sql、批量造数脚本seed.py、清理脚本teardown.sql,方便反复练习。 - 数据量级要符合 OLAP 场景(建议至少百万行起,关键章节给出千万 / 亿级造数脚本以体现性能差距)。
HTML 演示页面(
demo.html)- 单文件、零依赖(或仅引入 CDN),打开即可在浏览器中可视化演示该章节的核心概念。
- 例如:用动画展示「行存 vs 列存的 IO 差异」「稀疏主键索引如何通过 Mark 跳过 Granule」「MergeTree Part 如何被后台合并」「ReplacingMergeTree 去重过程」「物化视图触发时机」「分布式查询的 fan-out / fan-in」「副本之间的 ZooKeeper/Keeper 协调」等。
- 页面要有交互(按钮、输入框、步进控制、可调数据规模),让读者能「点一下看一步」,并能直观感受到列存压缩、稀疏索引带来的扫描量差异。
面试题清单
- 收集大厂真实面经中该章节的高频题目(至少 5 题)。
- 每题给出:题目 → 考察点 → 标准答案(分点作答)→ 加分项 / 易错点 → 与 MySQL/PG 或同类 OLAP(Doris / Druid / StarRocks)的对比要点(如适用)。
五、内容深度与表达要求
- 从 0 到 1:第一次出现的术语必须解释,不能默认读者知道(比如第一次提到 OLAP / OLTP、列式存储、向量化执行、Part、Granule、Mark、MergeTree、ReplacingMergeTree、Materialized View、Projection、Distributed Table、Keeper 都要先讲它是什么)。
- 生活化类比优先:晦涩点(列式存储、稀疏主键索引、MergeTree 合并、ReplacingMergeTree 的「最终一致去重」、SummingMergeTree 的「自动汇总」、物化视图、分布式表 fan-out、副本一致性、TTL 过期、Projection)必须先用生活例子打比方,再讲技术细节。
- 能动手:所有 SQL、代码、演示页面读者都能复制即用,不要出现伪代码或「此处省略」。所有性能结论必须给出可复现的对比实验(同一台机器、同一份数据、同一条 SQL,开 / 关某项优化的耗时对比)。
- 由浅入深:先讲「怎么用」,再讲「为什么这么设计」,最后引申「源码思想 / 性能调优 / 踩坑」。
- 横向对比:在合适位置加「📌 与 MySQL/PG 的区别」小框,例如:
- 存储模型:InnoDB 行存聚簇 vs ClickHouse 列存 + 稀疏主键
- 主键含义:MySQL 主键唯一约束 vs ClickHouse 主键仅用于排序与稀疏索引(不保证唯一)
- 事务:MySQL/PG 完整 ACID vs ClickHouse 仅有限事务(单分区写入原子)
- 更新 / 删除:MySQL
UPDATE/DELETE实时生效 vs ClickHouseALTER TABLE … UPDATE/DELETE(Mutation,异步重写) - JOIN:MySQL/PG 优化器全场景 vs ClickHouse 大表 JOIN 弱、推荐宽表 / 字典 / 物化视图
六、建议的章节大纲(可在执行时微调)
- ClickHouse 是什么 & 为什么快(OLAP vs OLTP、列式存储、向量化执行、压缩、ClickHouse 的诞生背景与典型场景、与 Doris/Druid/StarRocks 的定位差异)
- 客户端与基础 SQL(
clickhouse-client/ HTTP / JDBC、库 / 表 / 视图三级结构、DDL/DML/DQL、SHOW、DESCRIBE、SYSTEM命令、ClickHouse SQL 方言与标准 SQL 的差异) - 数据类型详解(数值、
String/FixedString、LowCardinality、Date / DateTime / DateTime64、Decimal、UUID、Enum、Array、Tuple、Map、Nested、Nullable的代价、AggregateFunction) - 表引擎全景图(
MergeTree家族 /Log家族 /Memory/File/URL/MySQL/PostgreSQL/Kafka/S3/Distributed/Materialized*,以及如何根据场景选择) - MergeTree 核心原理(Part 目录结构、
primary.idx稀疏索引、Mark 与 Granule、index_granularity、Skip Index 跳数索引:minmax/set/bloom_filter/ngrambf_v1等、PARTITION BY / ORDER BY / PRIMARY KEY 关系) - MergeTree 家族进阶(
ReplacingMergeTree去重、SummingMergeTree预聚合、AggregatingMergeTree聚合状态、CollapsingMergeTree/VersionedCollapsingMergeTree行折叠、GraphiteMergeTree,以及FINAL关键字的代价) - 写入与读取最佳实践(批量写入、避免小批次、
async_insert、Buffer引擎、INSERT ... SELECT、FORMAT全家桶、查询并发与max_threads) - 聚合、窗口函数与数组(
GROUP BY/WITH ROLLUP / CUBE / TOTALS、HAVING、丰富的聚合函数uniq* / quantile* / topK / argMax、窗口函数、ARRAY JOIN、Lambda 与高阶数组函数) - JOIN 与字典(
INNER/LEFT/RIGHT/FULL/CROSS/ANY/ASOFJOIN、JOIN 的内存代价、GLOBAL JOIN、Dictionary字典作为「右表」加速、字典源mysql / postgresql / http / file) - 物化视图与 Projection(普通视图 vs 物化视图、
POPULATE的坑、链式物化视图、AggregatingMergeTree+MaterializedView实时聚合、Projection 与物化视图的取舍) - TTL、分区与数据生命周期(
PARTITION BY设计原则、TTL ... DELETE / TO VOLUME / TO DISK、冷热分层存储、分区裁剪、OPTIMIZE TABLE ... FINAL的代价) - Mutation:UPDATE / DELETE 的真相(
ALTER TABLE … UPDATE/DELETE异步重写机制、system.mutations、轻量级lightweight DELETE、REPLACE PARTITION,以及为何 ClickHouse「不适合频繁改」) - 副本与分布式(
ReplicatedMergeTree+ ZooKeeper/ClickHouse Keeper、副本同步流程、Distributed引擎与本地表的关系、分片键、internal_replication、读写路径全景图) - 集成生态(
Kafka引擎做实时摄入、MaterializedPostgreSQL实时同步、S3/HDFS读写、MySQL/PostgreSQL表函数、remote()跨集群查询、Airbyte / Debezium 入仓) - 权限、配额与多租户(用户与 Profile、
GRANT/REVOKE、行级 / 列级权限、Quota 配额、max_memory_usage等关键限制、SQL 防御性配置) - 性能调优与查询分析(
EXPLAIN PLAN / PIPELINE / ESTIMATE、system.query_log/system.parts/system.metrics必看视图、trace_log与火焰图、常见慢查询模式与优化手段) - 运维与可观测(关键配置
config.xml/users.xml、SYSTEM命令族、备份与恢复(BACKUP / RESTORE、clickhouse-backup)、升级与版本兼容、Prometheus/Grafana 监控) - 生态与扩展(UDF:SQL UDF / Executable UDF、
clickhouse-local单机分析、chdb嵌入式、与 Spark / Flink / Superset / Metabase 的集成) - 综合实战项目(任选其一并贯穿:实时埋点分析平台 / 广告归因漏斗 / IoT 时序大屏 / 日志检索与告警 / 用户行为路径与留存分析)
七、产出格式约束
所有文档放在
learnNote/clickhouse/下,按序号_主题.md命名(如01_intro.md、02_client_basic.md)。每章节配套的演示页面与代码放在同名子目录中,例如:
learnNote/clickhouse/ ├── 0_learn_plan.md # 总学习路线(由本文档拆出来的精简版) ├── 01_intro.md ├── 01_intro/ │ ├── demo.html │ └── code/ │ └── hello_ck.py ├── 02_client_basic.md ├── 02_client_basic/ │ ├── demo.html │ ├── init.sql │ └── code/ │ └── basic_query.py ├── 05_mergetree_core/ │ ├── demo.html # 可视化演示 Part / Mark / Granule │ ├── init.sql │ ├── seed.py # 千万级造数脚本 │ └── code/ │ └── explain_demo.py ├── ... ├── docker-compose.yml # 可选:一键起 ClickHouse + Keeper ├── requirements.txt # Python 依赖(clickhouse-connect 等) ├── interview.md # 各章面试题总索引 ├── appendix_cheatsheet.md # 常用命令 / 函数速查表 ├── appendix_ck_vs_mysql.md # ClickHouse vs MySQL/PG 对比速查 └── appendix_pitfalls.md # 踩坑案例集(FINAL、JOIN、Mutation 等)文档中的代码块必须标注语言(
```sql、```bash、```python、```mermaid等),方便高亮。SQL 示例统一使用大写关键字 + 小写标识符(与官方文档一致),并在
01_intro.md开篇明确这一约定。涉及性能的章节必须给出可复现的对比数据:
- 表结构 / 数据量 / 机器规格写在小节开头;
- 用
EXPLAIN PIPELINE或system.query_log中的read_rows / read_bytes / memory_usage / query_duration_ms作为客观指标; - 给出「优化前 / 优化后」对照表。
面试题统一汇总到每章末尾的「面试高频题」小节,并在
learnNote/clickhouse/interview.md做总索引(按主题分类,例如「存储与索引」「MergeTree 家族」「副本与分片」「物化视图」「调优」「踩坑」)。
八、写作执行顺序(建议)
- 先产出
0_learn_plan.md:把第六节的大纲展开成「每章预计字数 / 核心知识点 / 配套实战 / 演示页要点 / 面试题数量」的表格,作为后续章节的施工图。 - 再按章节顺序逐个产出
0X_xxx.md+ 同名目录下的demo.html+init.sql+code/。 - 重点章节优先打磨:第 1、5、6、10、13 章是 ClickHouse 的「灵魂章节」,可以多投入篇幅与演示动画,其它章节保持节奏即可。
- 每完成 3 ~ 5 章,回顾一次
interview.md,把已完成章节的面试题归集进去。 - 全部章节产出后,再做一次总复盘:补充三个附录文档——
appendix_cheatsheet.md:常用 SQL / 函数 /SYSTEM命令 / 关键system.*视图速查表;appendix_ck_vs_mysql.md:ClickHouse vs MySQL / PostgreSQL / Doris / StarRocks 对比速查表;appendix_pitfalls.md:典型踩坑集(小批量写入、滥用FINAL、大表 JOIN、Nullable滥用、Mutation 阻塞、OPTIMIZE FINAL误用、分区粒度过细等)。