土法炼钢兴趣小组的算法知识备份

列存引擎内核 — 系列规划

目录

列存引擎内核 — 系列规划

本文是写作规划,不是可发布正文。主选 ClickHouse 作为拆解对象,DuckDB 作为嵌入式/OLAP 对照;不写泛泛的「列存概念」科普。


一、为什么写这个系列

1.1 存储引擎三角的缺口

已有内容 引擎类型 视角
postgresql-kernel/ (26) 行存 OLTP B-Tree + MVCC + WAL
db/lsm-tree/ (9) 写优化 LSM MemTable + SSTable + Compaction
storage/ (79) 通用原理 含列存概念但未落到具体实现
db-frontier/ (25) AI 原生 DB 前沿 向量/HTAP,非经典列存内核

结论:读者理解行存(PG)和写优化(LSM)后,缺 读优化列存 的完整源码级拆解。ClickHouse 是开源列存工程标杆;DuckDB 代表「嵌入式分析」路径——两者对照覆盖 OLAP 主战场。

1.2 为什么选 ClickHouse(主)+ DuckDB(辅)

维度 ClickHouse DuckDB
源码 C++,结构清晰,MergeTree 家族完整 C++11,向量化执行教科书
文档 官方 MergeTree 文档详尽 官方 Internals 文档
生产案例 国内大量 OLAP/日志分析 数据科学、SQLite 替代分析
与 PG 关系 常作 PG 分析副本/外表 pg_duckdb 扩展兴起
系列篇幅 主系列 15–18 篇 3–4 篇对照/专题

1.3 系列定位

列存 = 存储布局 + 向量化执行 + 合并策略 + 分布式(可选)

不写 SQL 教程,写: - 为什么列存 scan 1 列比行存读整行快(含 CPU cache / SIMD) - MergeTree part 如何 merge、为什么 merge 是列存的心脏手术 - PRIMARY KEY 在 ClickHouse 里不是唯一约束——排序键语义 - 向量化 volcano vs 向量批处理(morsel-driven)


二、核心问题与目标读者

2.1 六个关键问题

  1. 列存文件在磁盘上长什么样? → 第 1、2 章:Part、Column、Mark、Granule、压缩块。

  2. 一次 SELECT 如何从 part 读到向量批? → 第 3、4 章:Read path、Mark Range、PREWHERE、向量化执行。

  3. MergeTree 的 merge 到底在合并什么? → 第 5、6 章:Merge 算法、TTL、Mutation vs Merge。

  4. ClickHouse 的「索引」是什么? → 第 7 章:稀疏主键索引、跳数索引(minmax/set/bloom)、与 B-Tree 的本质差异。

  5. 分布式表如何工作? → 第 8、9 章:Local table、Distributed、ReplicatedMergeTree、ZooKeeper/ Keeper 协调。

  6. 列存生产环境会出什么事故? → 第 14–16 章:Parts 过多、merge 跟不上、mutation 阻塞、副本延迟、内存 OOM。

2.2 目标读者


三、篇目结构(主系列 16 篇 + DuckDB 专题 3 篇)

第一部分:存储格式(第 1–3 章)

第 1 章:列存基础与 ClickHouse 架构

第 2 章:MergeTree Part 文件格式

第 3 章:压缩与编码

第二部分:读取路径(第 4–7 章)

第 4 章:向量化执行引擎

第 5 章:查询读取路径

第 6 章:Merge 与 Mutation

第 7 章:索引与跳数索引

第三部分:分布式与高可用(第 8–10 章)

第 8 章:ReplicatedMergeTree

第 9 章:Distributed 引擎

第 10 章:物化视图与增量管道

第四部分:DuckDB 对照专题(第 11–13 章)

第 11 章:DuckDB 架构与嵌入式 OLAP

第 12 章:DuckDB 向量化与 Pipeline

第 13 章:ClickHouse vs DuckDB 选型

第五部分:运维实战(第 14–16 章)

第 14 章:监控与系统表

第 15 章:经典故障模式

第 16 章:配置陷阱与容量规划


四、依赖关系

1 → 2 → 3 → 4 → 5
        ↓       ↓
        6 ← 7   8 → 9
                ↓
               10
11 → 12 → 13(DuckDB,可与 4–7 并行)
14 → 15 → 16

五、阅读路径

路径 篇目 适合
OLAP 开发者 1→2→4→5→7 理解读写
平台/运维 1→6→8→14→15→16 集群稳定
嵌入式分析 11→12→13 DuckDB
从 PG 来 1→7→5 + PG 14 对照 索引语义差异

六、来源台账

A 级

B 级


七、实验台账

环境 | ClickHouse 24.x single node + 可选 2-node replica |
工具 | clickhouse-clientclickhouse-local、系统表 |
数据集 | hits 样本或 clickhouse-benchmark 默认 |
实验
2 列文件 hex 结构对照文档
3 编码压缩比表
5 PREWHERE 行数对比 EXPLAIN
6 触发 merge + 观察 system.merges
8 副本 lag 人工制造
15 too many parts 复现(测试环境)

八、系列联动

系列 联动
postgresql-kernel/ 执行器、B-Tree、监控对照
db/lsm-tree/ Compaction vs Merge 对照
storage/ 压缩、块设备
observability/ 日志/trace 写入 ClickHouse 场景

九、边界

不承诺


十、写作顺序

  1. index.md
  2. 第 1、2、3 章(格式基础)
  3. 第 4、5 章(读路径)
  4. 第 6、7 章(merge 与索引)
  5. 第 14、15、16 章(运维,可与 8–10 交错)
  6. 第 8、9、10 章(分布式)
  7. DuckDB 11–13

十一、待确认问题

  1. ClickHouse 版本锚定:24 LTS?
  2. Keeper 替代 ZooKeeper 是否作为默认写法?
  3. DuckDB 3 篇是否并入主 index 还是子目录 duckdb/
  4. 是否增加 MergeTree 以外引擎(如 S3Queue)专章?

规划版本:v1,2026-06-18 目录建议:post/db/columnar-engine/

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-18 · database / storage

【列存引擎内核】ClickHouse 与 DuckDB 源码级拆解

主选 ClickHouse 拆解 MergeTree 存储格式、向量化执行与分布式协调;DuckDB 作为嵌入式 OLAP 对照。覆盖列存文件布局、merge 机制、跳数索引与生产故障模式,面向数据平台工程师与从 PG/MySQL 转 OLAP 的 DBA。


By .