【数据库研究前沿】Text-to-SQL 与 Agentic Query:DIN-SQL、C3、DAIL-SQL 工程复盘
Spider / BIRD 评测、DIN-SQL / C3 / DAIL-SQL 的核心机制、schema linking 与 self-consistency,以及一个离线可跑的最小 Text-to-SQL 闭环 demo
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
共 238 篇文章 · 返回首页
Spider / BIRD 评测、DIN-SQL / C3 / DAIL-SQL 的核心机制、schema linking 与 self-consistency,以及一个离线可跑的最小 Text-to-SQL 闭环 demo
定位 Lucene 9.x/10.x 库内核与 Elasticsearch 8.x 服务层相对 architecture/42、storage/29、向量引擎与 PG GIN 的分工;以最小索引故事建立坐标系,交代倒排索引学术谱系与 18 篇路线图。
拆解 Lucene Index/Document/Field 与段内 docID 分配;说明 indexed、stored、docValues 三组正交开关;对照正排与倒排访问路径,为 Analyzer 与 postings 篇奠基。
拆解 Lucene Analyzer 的 CharFilter→Tokenizer→TokenFilter 管线与 TokenStream 契约;说明分词如何影响写放大与词典规模;中文分词只谈接口与运维代价,不展开 NLP 算法教程。
说明 Lucene 段内 Terms 词典如何用 FST 做前缀共享与内存映射;介绍 TermsEnum seek 与字段迭代;与 PostgreSQL GIN Entry Tree 对照一句,为 postings 定位奠基。
拆解 Lucene PostingsFormat 中 freqs/positions/offsets/payloads 各层语义;说明块编码、skip list 与 impacts 如何服务相交剪枝;解释短语查询为何依赖 positions。
从 Robertson & Zaragoza (2009) 的 BM25 公式出发,拆解 Lucene BM25Similarity 如何把 TF 饱和、文档长度归一与 IDF 落到 postings 与 norms;对照 TF-IDF 工程差异,并划定与学习排序的生产边界。
拆解 Lucene IndexWriter 的 RAM 缓冲、flush 出段与 DirectoryReader.open(IndexWriter) 近实时语义;说明 Searcher 刷新与「刚写入即可搜」在库层与 ES refresh 层各自保证什么。
说明 Lucene TieredMergePolicy 如何把多段收成更少大段、软删除如何通过 liveDocs 维持可见性并延迟空间回收,以及 force merge 在 Elasticsearch 中的代价与适用边界。
从 BooleanQuery 的 SHOULD/MUST 语义出发,拆解 Lucene BooleanScorer、两阶段迭代(近似+验证)、Collector 与 TopDocs 截断,以及 galloping 相交与 postings impacts 跳跃剪枝的关系。
说明 Lucene DocValues 的列式访问模型如何服务排序、聚合与脚本,stored fields 的随机取原文代价,以及 Elasticsearch 聚合管线对 DocValues 的依赖——为第 14 篇预埋。
在 Lucene 段模型之上拆解 Elasticsearch 8.x 的 Index、主分片哈希路由、副本读写分工,以及 cluster state 元数据膨胀如何成为 master 瓶颈;与 architecture/42 分片陷阱对读,不复述全文。
用保证矩阵拆解 Elasticsearch 8.x 的 refresh、flush、translog 各自承诺什么:可搜窗口、磁盘持久化、崩溃恢复;对照 refresh_interval 与 wait_for,并在单节点 8.15 上实测写入可见性。
拆解 Elasticsearch 8.x 搜索的两阶段 scatter-gather:协调节点扇出 query phase 收集 doc id 与排序键,再 fetch phase 取 stored fields,reduce 全局 Top-K;并说明 DFS 如何修正跨分片 IDF。
沿 Elasticsearch 8.x 聚合执行路径说明为何 terms/date histogram 走 doc values 而非倒排,协调节点如何合并分片桶;并以 dynamic mapping 字段爆炸解释 circuit breaker 与排障入口。
只谈 Elasticsearch 8.x / Lucene 上 BM25 与 kNN 的组合接口与段内共存代价,ANN 算法与专用向量引擎细节外链 vector-engine 与 db-frontier/08;指出倒排与向量同 Segment 生命周期尚未统一的开放问题。
对照 Elasticsearch 8.x 与 OpenSearch 的许可与发行分叉,说明二者与 Solr 如何共享 Lucene 段模型;Solr 仅作边界一句,内核机制仍回链本系列 01–15 篇。
用症状到机制的决策树覆盖 circuit breaker、refresh 过频、大字段、分片过多与慢查询 explain,逐条回链本系列 Lucene 段与 ES NRT 篇章;不含未跑集群 benchmark。
给出 ES/OpenSearch、PostgreSQL GIN、ClickHouse 全文、专用向量引擎与「仅日志检索」的扩展决策树;回链 observability/08 与 llm-infra RAG,收束本系列 18 篇开放问题。
补齐搜索架构叙事与 RAG/向量引擎之间的全文检索内核层:以 Lucene 9.x/10.x 拆解 Analyzer、FST、postings、BM25 与 IndexWriter,并以 Elasticsearch 8.x 拆解分片、refresh/translog 与查询路径;OpenSearch 对照与选型收束。
定位进程内 HashMap、Memcached、Redis 与 RocksDB 嵌入 KV 在内存缓存栈中的生态位;划分与 architecture/17、storage/66、linux/redis-source 的分工,并给出本系列 16 篇阅读地图。
按 Redis OSS 7.4/8.x 源码拆解 aeEventLoop 文件/时间事件、beforeSleep 钩子与客户端 querybuf/reply 路径,并精确说明 IO threads 只卸载读写与解析、命令仍在主线程执行。
拆解 Redis 7.4/8.x 的 redisObject 多态层与 SDS 二进制安全字符串:type/encoding/refcount 如何分工、字符串四种编码的升级路径、OBJECT ENCODING 能读到什么,以及紧凑表示与统一抽象之间的工程争论。
从 Redis 7.4/8.x 的 dict 源码拆解链式哈希、双表渐进 rehash、rehashidx 步进与 DICT_RESIZE_AVOID 在 fork 期的行为,并对照站内哈希表内部文章说明与教科书一次性扩容的差异。
Redis 7.4/8.x 如何用 listpack、quicklist、intset 为小集合省内存:ziplist 退场原因、各 type 的 encoding 升级阈值与配置项默认值,以及紧凑表示在 CPU 与内存之间的工程争论。
Redis 7.4/8.x 有序集合的双结构 skiplist+dict 与小 listpack 编码、Pugh 跳表参数如何落地,以及 Stream 的 rax+listpack 存储与 consumer group / PEL 的最小必要语义——不扩写消息队列教科书。
拆解 Redis 7.4 的 TTL 机制:expires 辅助表、lookup 路径惰性删除、activeExpireCycle 自适应采样,以及 lazyfree 异步释放大对象对延迟的影响。
从 evict.c 拆解 volatile/allkeys 与 LRU/LFU/random/ttl 策略矩阵、24 位时钟近似 LRU、淘汰池采样,并对照算法篇真 LRU 与 MEMORY DOCTOR 信号。
从 rdb.c 拆解 SAVE/BGSAVE 的 fork 写时复制语义、子进程快照路径,以及 REDIS 魔数与 opcode 锚定的 RDB 格式边界。
从 aof.c 拆解 AOF 多段清单、feedAppendOnlyFile 写路径、后台 rewrite 与 appendfsync always/everysec/no 各自的丢失窗口及 fsync 失败语义。
说明 Redis 7.4 默认开启的 RDB preamble + INCR AOF 如何组合恢复路径,结合 fsyncgate 与数据完整性给出 appendfsync 与混合模式的配置决策树及耐久争论边界。
按 Redis 7.4/8.x replication.c 拆解 PSYNC 部分重同步、环形 replication backlog 与 replica-read-only 语义,对照异步复制与读己之写(read-your-writes)的工程边界,说明副本滞后如何改写 Cache-Aside 一致性假设。
按 Redis Cluster Spec 与 cluster.c 拆解 CRC16 取模 16384 的 hash slot、MOVED 与 ASK 重定向语义,对照客户端一致性哈希,说明 hash tag 下同槽多 key 原子性边界与迁移期 TRYAGAIN。
对照 Facebook Scaling Memcache(NSDI'13)与 Memcached 多线程+slab 分配器,拆解 Redis 多态编码与持久化带来的角色差异,说明在 Cache-Aside 场景下何时应选纯缓存而非数据结构服务器。
按 Redis Latency Monitoring 与 INFO/SLOWLOG 信号,建立大 key、fork 延迟、阻塞命令、内存碎片四类故障的排查决策树;给出可在本机 redis-server 上执行的复现命令清单,不粘贴伪造输出。
用决策树收束 standalone、Sentinel、Cluster 与纯缓存分工,简述 Valkey ABI 社区分叉与 Redis 模块边界,列出多线程与持久化争论,并给出回到本系列、architecture/17 与 RocksDB 的阅读地图以闭合全系列。
补齐内存 KV / 缓存服务器内核层:从 ae 事件循环与 redisObject 多态编码,到 TTL/maxmemory 近似淘汰、RDB/AOF 持久化语义,再到复制、Cluster hash slot 与 Memcached 对照。
定位专用向量检索引擎相对 ANN 算法、RAG 应用与湖仓格式的分工;以 Milvus 2.6.x 四层架构与 insert/search 最小故事建立坐标系,并交代从 SIGMOD 2021 到 Streaming 演进的谱系与常见误解。
把 HNSW、IVF、DiskANN、Flat 收成引擎侧 Train/Build/Load/Search 契约与构建期/查询期参数面;用生命周期图与召回–QPS–内存三角说明索引如何贴着 Segment,并与 db-frontier/08、第 8 篇 Knowhere 分工。
用最小故事钉住 Milvus 2.6.x 数据模型:Collection/Partition、vchannel/pchannel 与 Streaming Node 绑定,Growing/Sealed、flush 与 handoff 状态机,并纠正「一个 Collection 一张大图」等常见误解。
以一次 collection 生命周期里的 DDL/DML/DQL 请求为线索,拆解 Milvus 2.6.x 无状态 Proxy 的路由与 MPP 归并,单活跃 Coordinator 的 TSO/timetick 全序机制与任务调度,并对照 Spanner/TiDB 的时间戳设计说明工程取舍。
以一条 insert 从 SDK 到「立刻能被搜到」的最小故事为线索,拆解 Milvus 2.6.x Streaming Service 三件套、Message/TSO 写顺序、Woodpecker 零本地盘 WAL 的 MemoryBuffer/QuorumBuffer 模式,并标明官方吞吐数字的引用边界。
以 flush 后去对象存储里查看文件为线索,拆解 Milvus 2.6.x 的对象路径结构(insert_log/delta_log/stats_log/index_files)、V1 按字段拆分与 V2 按段整合 Parquet 的寻址代价差异,并给出官方文档中可核对的 API 调用量级引用。
按 Milvus 2.6.x Data Processing 与 Architecture 拆解 Query Node 对 Sealed 的加载与段级检索,说明 Streaming Node 上 Growing 路径与 Query Delegator 如何拼成一次 search,用最小故事与常见误解钉住 Segcore 与 Knowhere 的层次边界。
按官方 Knowhere 文档说明其在 Milvus 中的位置、相对 Faiss 的扩展(bitset、SIMD 选择、二进制度量)、VecIndex 类层次与 IDMAP/IVF/HNSW 等类型,用插件注册、CPU/GPU 分发与 bitset 进查询三张图钉住工程契约,并与 db-frontier/08 的算法细节分工。
按 Milvus 2.6.x Data Processing 与 Architecture 拆解 search 的多级归并树:Proxy → Streaming Node Delegator → Query Node 段级结果;用最小故事、GuaranteeTs 等待时序图与常见误解说明一致性级别如何变成排队等待。
说明 Milvus 2.6.x 中 Data Node 作为离线 Worker 如何承接 Coordinator 下发的建索引与 compaction,输入输出如何进出对象存储;用最小故事、常见误解与队列积压图说明索引堆积如何拖垮查询新鲜度与资源争用。
按 Milvus 2.6.x Bitset、Filter Templating 文档拆解表达式如何变成 bitset 再喂给 Knowhere;用最小故事、bitset 取反细节与选择度打穿 Top-k 归并的示意图,说明为何过滤会改变延迟而不只是改变结果数量;对读 db-frontier/09 的 ACORN、Filtered-DiskANN 争论。
按官方 Consistency Level 与 Timestamp 文档拆解 Strong/Bounded/Session/Eventually 如何映射到 GuaranteeTs,用最小故事、四级时间轴与 Strong 等待时序图说明「一致性」在 Milvus 里首先是一笔延迟账;对照 Abadi PACELC 定理与 Bailis PBS,说明 Bounded 是定性旋钮而非概率保证。
按 2.6.x Delete/Upsert/TTL 文档拆解软删 bitset 从逻辑不可见到 compaction 物理回收的完整生命周期,用官方 override/merge 内部步骤的时序图区分两种 upsert,并与 FreshDiskANN 的图索引删除模型对照,说明 Milvus 用「整段重建」而非「增量合并」处理删除。
按官方 In-Memory Replica 与 Streaming Service 文档拆解副本组、shard leader、Proxy 缓存 failover 与 WAL Wait for Ready;用多副本拓扑图与迁移时序图说明 Milvus 的读副本更接近只读缓存池而非共识复制,并与 Chain Replication、PacificA 对照。
对照 Qdrant 与本系列 Milvus 主线:Segment 内的向量/payload/id mapper 三件套、WAL+序号版本化、后台 optimizer 四类任务,以及 Raft 只管拓扑不管点操作的分布式模型;说明何时单进程/小集群更合适。
承接 lakehouse/21 的 Lance vs Parquet 实测口径,用官方 Table Format 规范拆开 fragment/manifest/version 与 Milvus Segment/WAL 的边界;对照两边索引异步构建的共性,并给出湖侧 snapshot 与在线引擎可见性水位的对齐方式。
用症状到机制的决策树覆盖召回/延迟/堆积/OOM 四类故障,按可见性、段状态、过滤选择度、离线队列、对象存储与副本拓扑逐层定位;用一个跨软删广播与副本改派的最小故事说明为什么同一查询会得到不稳定结果,不含未跑的集群数字。
扩展选型决策树:从单机原型到十亿级多租户,逐层加入湖上格式、SQL 同进程、存算分离运维、多一致性级别四个判断轴;用一个团队规模演进的最小故事串起决策点,并回链 llm-infra RAG 与本系列全部核心论文谱系。
补齐 ANN 算法与 RAG 应用之间的生产级向量引擎层:以 Milvus 2.6.x 为主线拆解 Segment、WAL、Segcore、Knowhere、混合过滤与一致性,并用 Qdrant、LanceDB 对照选型。
行存 vs 列存的带宽、压缩与向量化三角;ClickHouse Server 进程模型、线程池与 MergeTree 引擎家族地图;src/Storages 与 src/Processors 源码入口。对照 PG 行存与 LSM 写优化路径,版本锚定 ClickHouse 24.x LTS。
ClickHouse MergeTree Part 目录结构:columns.txt、checksums.txt、.bin、.mrk2、primary.idx 语义,Granule 与 Mark 的定位作用,Wide/Compact 布局与 MergeTreeDataPart 源码入口。版本锚定 24.x LTS。
ClickHouse 列压缩:LZ4、ZSTD、Delta、DoubleDelta、Gorilla 时序编码与列类型关系;CODEC 链顺序、LowCardinality 与 PG TOAST 对照。压缩比须本机实测,本文不编造倍数。
ClickHouse Block 列向量 batch、IProcessor Pipeline 与 filter/project/aggregate 向量实现;对照 PostgreSQL 火山模型 ExecProcNode。源码入口 src/Processors、src/Columns。24.x LTS。
MergeTree SELECT 读路径:Mark Range 定位 Granule、PREWHERE 与 WHERE、Part 级并行与 max_threads。EXPLAIN indexes=1 解读方法。24.x LTS,无伪造 EXPLAIN 输出。
MergeTree 后台 merge 触发与 selector、ReplacingMergeTree/CollapsingMergeTree 语义、ALTER UPDATE/DELETE mutation 异步路径与危害。对照 LSM compaction。源码 MergeTreeDataMergerMutator。24.x LTS。
ClickHouse PRIMARY KEY 排序键稀疏索引语义、Data Skipping Index(minmax/set/bloom_filter)与 Mark Range 协同;对照 PostgreSQL B-Tree。24.x LTS。
ReplicatedMergeTree 副本协调:Log entry、ClickHouse Keeper/ZooKeeper 路径、副本同步与 recovery。双节点实验步骤(本环境未部署)。24.x LTS 默认推荐 Keeper。
ClickHouse Distributed 表的分片键、写入路由与 SELECT 下推;GLOBAL IN/JOIN 的代价与替代方案;与 ReplicatedMergeTree 副本层的关系;对照 PG Citus 的边界。
ClickHouse Materialized View 的触发语义、块级增量与目标表引擎选择;Kafka Engine + MV 典型架构;与 PostgreSQL 触发器/MV 的对照及常见坑。
DuckDB 进程内嵌入式模型、Storage 的 Row Group 与 Column Segment、Catalog 与 checkpoint;与 ClickHouse Server 部署差异及 pg_duckdb 联邦场景边界。
DuckDB 向量批执行、morsel-driven 并行、Pipeline 调度与 spill;源码 execution/parallel 路径;对照 ClickHouse Processors 与 PG volcano 模型。
从部署形态、规模、并发、联邦与运维成本五维对比 ClickHouse 与 DuckDB;给出决策树与组合架构,不排名不测虚构 benchmark。
ClickHouse system.parts、merges、replicas、query_log 与 replication_queue 的字段语义;parts 数、merge 延迟、内存 tracking 的可观测性基线与告警思路。
Too many parts、merge 跟不上 insert、mutation 堆积、副本延迟与 lost replica、max_memory_usage OOM 的症状链、根因与缓解;附测试环境复现框架。
parts_to_throw_insert、merge 线程池、max_bytes_to_merge、merge_max_block_size、磁盘 SSD/HDD 策略与内存预算;MergeTree settings 与服务器级 config 的容量规划方法。
主选 ClickHouse 拆解 MergeTree 存储格式、向量化执行与分布式协调;DuckDB 作为嵌入式 OLAP 对照。覆盖列存文件布局、merge 机制、跳数索引与生产故障模式,面向数据平台工程师与从 PG/MySQL 转 OLAP 的 DBA。
从 RocksDB 内核侧补全 Flink KeyGroup 前缀与增量 checkpoint SST 上传机制,对照 TiKV Region 引擎与 Kafka Streams changelog 容错;不重复 stream/12 作业侧全文,给出 Docker 复现步骤而不伪造 checkpoint 指标。
以 IVM 历史、Differential Dataflow、DBSP(Z-set 与线性化)为主线,对比 Materialize、RisingWave、Feldera 的架构取舍,划清与 Flink/Kafka Streams 的能力边界,并附 Python Z-set 最小增量 join demo
从批、流、微批四维度对比出发,建立「可重放日志 + 有状态计算」心智模型,厘清 Lambda/Kappa 边界与流表对偶,并给出与 lakehouse 入湖侧对称的全系列地图。
拆解 event time、processing time、ingestion time 三种时间语义,给出 watermark 的形式化含义与 bounded-out-of-orderness 等生成策略,并说明侧输出、allowed lateness 如何处理迟到数据;附 event-time 与 processing-time 窗口对比的可复现实验步骤。
从 WindowAssigner 三类(Tumbling、Sliding、Session)出发,讲清窗口 state 如何随 key 与窗口实例增长,Trigger 与 Evictor 如何改变 firing 与清理节奏,GlobalWindow 自定义 Trigger 的边界,并与批式 GROUP BY 时间分桶对照;附三种窗口 state 观测的可复现步骤。
从 Topic、Partition 到 Log Segment 的 .log/.index/.timeindex 文件布局,讲清 offset 单调性、分区内有序、顺序写与 sendfile 读路径,以及 Kafka 3.x KRaft 模式下元数据与日志目录的分工,为副本与 consumer 语义打底。
从 Leader/Follower 复制、HW/LEO/ISR 到 acks 与 min.insync.replicas 的 durability 边界,再到 consumer group 分区分配、rebalance 代价,以及 offset 提交与 Flink checkpoint 的分工。
从幂等 producer 的 PID 与 sequence 去重,到事务 producer 的 init/begin/commit/abort 生命周期、__transaction_state 与 read_committed 隔离,讲清 Kafka 3.x 单集群 EOS 边界及其与 Flink checkpoint 的衔接。
从 JobManager、TaskManager、Slot 到 StreamGraph→JobGraph→ExecutionGraph 的四层编译链,讲清 operator chain、并行度、SlotSharingGroup 如何决定任务在集群上的物理形态,并与 Kafka 消费位点提交分工衔接。
拆解 Source/Transform/Sink 数据流图、rebalance/keyBy/broadcast 等 shuffle 策略、keyBy 到 KeyGroup 的映射,以及 ProcessFunction 与 TimerService 如何承载事件时间逻辑,并引入算子状态与键控状态的分工边界。
系统拆解 ValueState、ListState、MapState、ReducingState、AggregatingState 的语义与适用场景,对比 HashMapStateBackend 与 EmbeddedRocksDBStateBackend 选型,讲清 State TTL 的更新/可见性/清理策略,并给出窗口 state 与 RocksDB 磁盘占用的估算方法。
从 Chandy-Lamport 分布式快照到 Flink aligned/unaligned checkpoint:CheckpointCoordinator 触发—ack—完成生命周期,Kafka source 如何把 partition offset 写入 checkpoint,以及 interval、timeout、min-pause、concurrent checkpoints 的调优边界。
对比 Savepoint 与 Checkpoint 的生命周期与格式取舍;讲清 operator uid、rescale、schema evolution 规则,cancel/stop with savepoint 流程,Flink 版本升级恢复,以及 key serializer 不兼容等故障的排查与 State Processor API 边界。
拆解 Flink EmbeddedRocksDBStateBackend 的物理布局:每个 subtask 独立 RocksDB 实例、ColumnFamily 与 KeyGroup 前缀映射、写路径 memtable→WAL→flush→compaction 与 lsm-tree 系列对照、读路径 block cache 与读放大、增量 checkpoint 与全量 snapshot 的 IO 差异。
在 RocksDB state backend 读写路径之上,拆解窗口 state 膨胀、LSM 写放大与 checkpoint 争抢磁盘、Flink managed memory 与 RocksDBOptionsFactory 调参边界,以及 hot key 导致单 subtask 过热时的诊断与「改 state 设计 vs 拧参数」取舍。
用 Source、引擎、Sink 三层模型拆解 at-most-once、at-least-once、exactly-once 的组合规则与最弱环决定律;对照 Flink checkpoint 模式、Kafka 事务与幂等 producer、重复消费/重复写入的三类修复手段,为两阶段提交 sink 铺垫。
拆解 Flink GenericTwoPhaseCommitSink 协议:preCommit 进 checkpoint、commit 挂 notifyCheckpointComplete;对照 Kafka 事务 sink、JDBC 与 Iceberg 2PC 落点,以及 commit 前/后崩溃与重复 commit 的幂等边界——与 lakehouse/11 CAS、lakehouse/19 入湖侧对读,不重复表格式全文。
从 Debezium 变更事件信封(op、before/after、source)入手,拆解 snapshot 与 streaming 两阶段、Kafka Connect 的 connector task 与 offset/schema history 主题,并说明引擎侧如何保证主键顺序与幂等,衔接 lakehouse 第 19 章 upsert 入湖。
从 Flink 作业侧拆解 checkpoint 间隔如何锁定 Iceberg 提交频率与小文件数量、背压如何拖慢 commit、并行 writer 如何触发 lakehouse/11 的乐观并发冲突,以及预聚合、bucket 分区与异步 compaction 和表治理的分工边界。
收束流式数据处理系列:Flink credit-based 背压如何沿算子链传播、Web UI 指标怎么读;数据倾斜、checkpoint 超时连锁、Kafka rebalance 风暴、RocksDB OOM、savepoint 不兼容五类生产故障的诊断与止血;Flink / Kafka Streams / Spark Structured Streaming / RisingWave 在状态模型、交付语义、运维与入湖成熟度上的对照表与选型决策树,不做排名。
承接数据湖流式入湖:从 Kafka 日志与副本语义,到 Flink 事件时间、watermark、窗口、RocksDB 状态与 checkpoint,再到端到端 exactly-once 与 Debezium CDC 入湖。面向数据平台与实时工程师,补全批式湖仓之外的实时计算层。
从 log::Writer 的 32KB Block 分片 record、WriteBatch 二进制布局,到 DBImpl::WriteImpl 中 Group Commit 与 sync/fsync 语义,钉住写路径第一步:先 WAL 后 MemTable 的提交顺序与原子性边界。
从 SkipList MemTableRep、MemTableList 的 immutable 双缓冲队列,到 FlushJob::WriteLevel0Table 与 VersionSet 安装 L0 文件,闭合 WAL 之后 MemTable 如何变成 SST,并对照 lsm-tree DIY 实现。
从 BlockBasedTable 的 Data/Index/Filter Block 与 Footer 定界,到 VersionEdit 增量记录与 VersionSet::LogAndApply 如何维护 LSM 快照,并用 sst_dump 对照磁盘布局。
从 RocksDB 3.0 引入的 Column Family 出发,拆解共享 WAL、独立 MemTable/SST/Version 链、`ColumnFamilyHandle` 生命周期与 DBOptions/ColumnFamilyOptions 分层;并对照 Flink 多 state 变量到 CF 的映射边界。
拆解 Checkpoint 同盘硬链接快照、BackupEngine 增量备份目录布局、SstFileWriter 离线建表与 IngestExternalFile 的 sequence 分配及 write stall 边界——对接 Flink 增量 checkpoint 与 bulk load 运维路径。
补全存储引擎三角最后一角:从 LevelDB 基线与 RocksDB 架构演进,到 WAL/MemTable/SST 写路径、Get/Iterator 读路径、Leveled/Universal compaction 与 write stall,再到 Column Family、事务、Checkpoint 与 Flink/TiKV 嵌入对照。
以 LevelDB 1.23 为对照基线:拆解单后台 compaction 线程、无 Column Family 的 DBImpl 结构,以及 Write 队列 group commit、Get 层级查找与 SST/MANIFEST 最小语义,为 RocksDB 9.x diff 地图打底。
从 DBImpl::GetImpl 层级查找路径出发,拆解 LookupKey、sequence number 编码、SuperVersion 引用与 Snapshot 可见性边界;对照 PostgreSQL MVCC 的 txn id 语义差异。
沿 DBImpl::NewInternalIterator 拆解 InternalIterator 栈、MergeIterator 多路归并与 LevelIterator;说明 DBIter 上 tombstone/range del 的可见性裁剪及与 compaction 归并堆的同构关系。
对照 WriteBatch 原子性与 Snapshot MVCC,拆解 TransactionDB 悲观锁、OptimisticTransactionDB 提交时冲突检测、WritePrepared 的 prepare/commit 与 CommitCache 边界;TiKV 分布式事务仅作 B 级前瞻,不替代 Percolator 正文。
闭合存储引擎三角的最后一角:对照 PG B-Tree 与列存 scan,定位 LSM 写优化引擎在 TiKV、Flink、Kafka Streams、ClickHouse Embedded 中的嵌入方式,并划分本系列与 lsm-tree DIY、storage/31–32、stream/12 的分工边界。
对照 LevelDB 1.23,用 diff 表与源码路径梳理 RocksDB 9.x 的多线程 flush/compaction、Column Family、RateLimiter、Direct IO、Statistics 与并发 MemTable 写,建立后续读 db_impl 子文件的坐标系。
沿 TableCache 与 BlockBasedTable 读路径说明 Block Cache、Table Cache、Full/Ribbon Filter 与 Partitioned Index 如何裁剪点查 I/O;读放大度量与调参边界引用 storage/68,不重复全文推导。
从 L0 重叠与 L1+ 不重叠不变式、Size Ratio 与 base_level 动态计算,到 LevelCompactionPicker 如何选 L0→Lbase 与 Intra-L0;三种放大与 storage/31 衔接,exp10 用 db_bench stats 观察层级分布。
对照 Universal/FIFO/TTL compaction 策略,从 GetWriteStallConditionAndCause 与 WriteController 的 Stop/Delay token,到 DBImpl::DelayWrite 状态机、LOG 与 GetProperty 判读;exp11 用极低 L0 阈值触发 stall。
从 CompactionJob 的 Prepare/Run/Install 与 subcompaction 并行,到 Env 高低优先级线程池、MaybeScheduleFlushOrCompaction 调度,以及 GenericRateLimiter 的 kWritesOnly 与 DelayWrite 的争抢关系;exp12 三路中位数对比方法论。
用 GetProperty 与 LOG 钉住 L0 堆积、compaction 落后、Block Cache 未命中与 ENOSPC write stall 四类生产故障;交叉引用 storage/76 磁盘耗尽链,给出 db_bench 复现步骤而不伪造 stats 数字。
用决策树收束 RocksDB 与 InnoDB、列存、湖仓的适用边界;给出存储引擎三角 + 数据平台全栈阅读地图,对接 query-engine/18 与 postgresql-kernel,并标注 HTAP/TiKV 续作入口。
从 OLTP/OLAP/HTAP 边界、嵌入式 DuckDB 与分布式 Trino/Spark 分工、批式扫描与交互式查询延迟口径出发,闭合 lakehouse 与 stream-processing 之间的查询层缺口,并给出本系列 18 篇地图。
从 Parser/AST、Analyzer 与 Catalog 元数据到 LogicalPlan 算子树;对照 PostgreSQL parse/rewrite/plan 边界,并用 DuckDB 1.5.4 实测 EXPLAIN 与 Trino 476+ 文档中的 logical plan 结构对读。
RelNode、Convention、Trait 与 Rule-based 改写链;VolcanoPlanner/Cascades memo 搜索;Trino 476+ 自研 planner 与 Calcite 借鉴边界,对照 Spark Catalyst 优化阶段。
Table/column 统计、NDV 与 histogram、Iceberg Puffin/manifest 统计来源;Trino CostCalculator 与 CPU/IO/network 权重;统计过期导致全表扫与 join 中间结果膨胀;对照 PostgreSQL pg_statistic。
Join order enumeration、Hash/Merge/Nested Loop 适用条件;Trino broadcast vs partitioned join 与 shuffle 网络代价;Dynamic partition pruning 与 runtime filter;DuckDB HASH_JOIN 实测与 Spark AQE 对照边界。
从 Graefe Volcano 论文的 Open/Next/Close 接口出发,拆解 pull 语义、Sort/Hash Agg 等 pipeline breaker,并对照 PostgreSQL ExecutorRun 与 Trino 476+ Operator/Driver 的 Page 流水线。
拆解列向量 batch、SelectionVector 与 flat/dictionary 编码;对照 columnar-engine/04 的 ClickHouse Block 直觉,说明 DuckDB morsel-driven 与 Trino Page 流在 MPP 上的落地,并给出本机 DuckDB 1.5.4 实测。
从 Trino TableScanOperator 与 ConnectorSplit 出发,讲 column pruning、谓词/limit 下推在 ConnectorMetadata 的落点,以及必须留在引擎内的 Filter/Project 边界;与 lakehouse/18 读湖漏斗衔接。
拆解 hash join build/probe 内存布局、outer join 标记,以及 partial/final 两阶段聚合在 MPP 上的语义;对照 Trino 476+ spill/revocable memory 与 DuckDB 本机 HASH_JOIN 实测。
拆解 Trino Coordinator 与 Worker 的职责边界,从 Query 到 Stage、Task、Driver、Operator 的五层执行模型,Split 调度与 data locality,并与 Spark Driver/Executor/Stage 对照。
拆解 Trino 的 partitioning scheme(HASH、BROADCAST、REPLICATE、ROUND_ROBIN)、LocalExchange 与 Remote Exchange、PartitionedOutput 数据路径,以及 skew 在 EXPLAIN ANALYZE 上的判读;对照 Spark shuffle 与 AQE 边界。
主线拆解 Trino Coordinator 上 SqlQueryExecution 的生命周期:analyze、plan、fragment、Stage 调度到 Worker Task;Iceberg connector 如何从 snapshot/manifest 过滤生成 Split;Page 在 Operator 链上流动;EXPLAIN 与 EXPLAIN ANALYZE 字段判读。
拆解 Spark 3.5+ Catalyst 的 Analyzed / Optimized / Physical 计划链、whole-stage codegen 与 shuffle 边界、AQE 的动态 coalesce/skew join/broadcast;并与 Trino 476 及 Iceberg V2 reader 下推能力对照。
从单进程向量化 pipeline 与 morsel-driven 并行出发,对照 DuckDB 1.5.4 与 Apache DataFusion 的 planner/executor 边界;说明何时选嵌入式读湖、何时必须上 Trino MPP;与 columnar-engine DuckDB 存储篇分工,并用本机实测 EXPLAIN 与 Parquet 投影下推数据锚定结论。
与 lakehouse/18 分工:那边讲四层读湖漏斗是什么;本篇讲 Trino/Spark/DuckDB 在 SQL 优化链的哪一步把谓词变成 layout constraint、谁调用 Iceberg planning、split 如何携带残余谓词。引用官方文档与 lakehouse/18 本机 PyIceberg 实测,不伪造 Trino 计划输出。
拆解 Trino query/user/cluster 内存账户、revocable 与 non-revocable 内存、join/aggregation/order-by 的 spill 路径与 resource group 并发隔离;与 stream-processing 背压对照交互式 OLAP 的资源语义。依据官方文档,不伪造 OOM 或 spill 指标。
按全表扫、大 shuffle 倾斜、OOM/spill 失败、straggler task、metastore/catalog 超时五类生产故障,给出 planner/运行时观测入口与止血步骤;串联第 4–16 篇机制,不伪造 Trino UI 或 Spark 指标。
用决策树收束 Trino/Spark/ClickHouse/DuckDB/DataFusion/PostgreSQL 的适用边界:交互式联邦、批 ETL、嵌入式分析、流批一体各走哪条路径;给出能力对照表(无吞吐排名)与 postgresql→columnar→lakehouse→stream→query-engine 全栈阅读顺序,闭合数据平台栈。
闭合数据平台栈最后一块:从 SQL 解析与 Calcite 式优化,到 Volcano/向量化执行、Trino Coordinator/Worker 与 shuffle,再到 Iceberg connector 下推与生产排查。承接 lakehouse 第 18 章读湖视角,补全「谁在做 planning」的引擎内核层。
Hive 目录式分区表把『表』等同于『一组目录加 metastore 里的分区行』,于是没有原子提交、planning 要 LIST 目录、schema 与分区演进常要重写。本文用这三个硬伤切入,讲清 lakehouse 把表拆成『不可变数据文件 + 可变元数据指针 + catalog』三层后各自解决了什么,并给出全系列的分层地图。
拆 Parquet 的物理结构:file → row group → column chunk → page,footer 里的 FileMetaData(Thrift)与 PAR1 magic。讲清 PLAIN/RLE-bitpacking/字典/DELTA_BINARY_PACKED/BYTE_STREAM_SPLIT 各自压谁,Dremel 的 repetition/definition level 如何表达嵌套,column index/offset index 与 split-block bloom filter 怎样让谓词在读盘前裁掉 page。基于本机 pyarrow 24.0.0 真实 dump footer 与编码。
ORC 用 stripe 而非 row group、用三级统计(file/stripe/row-group index)而非独立 page index、用 PRESENT/DATA 等 stream 而非 page 组织一列。本文按 ORC 规范拆其文件尾(postscript + footer)、stripe 内部结构与 RLEv2 整数编码,并用本机 pyarrow 24.0.0 把同一份 30 万行数据写成 ORC 与 Parquet,对比真实体积与物理布局,最后给出什么场景仍用 ORC。
拆解 Arrow 列式内存布局(validity bitmap + value buffer + offset buffer)、零拷贝从何而来,以及 C Data Interface、IPC、Flight 三层跨边界传递。讲清 Arrow(内存计算格式)与 Parquet(磁盘存储格式)如何分工衔接。含 pyarrow 实测 C Data Interface 同地址零拷贝。
拆解 Parquet 的两层缩减:专用编码(dictionary / RLE / DELTA_BINARY_PACKED / BYTE_STREAM_SPLIT)降熵,再用 zstd/snappy/lz4/gzip 压字节。用 pyarrow 在同一列上实测不同编码+压缩组合的体积与读取耗时(3M 行,7 轮中位数),并与 ClickHouse CODEC 做同思想不同落地的对照。
对象存储不是网络版 POSIX 文件系统。本文用 S3 官方语义钉住四件事:强一致模型的边界、LIST 随对象数线性增长的代价、没有原子 rename(只能 copy+delete)、条件写(If-None-Match/If-Match)对提交协议的意义,并讲清 multipart 与对象不可改写。
目录式分区表(Hive 表)在对象存储上有三处硬伤:并发写部分提交、list planning 太贵、缺快照隔离与原子提交。本文拆开放表格式补上的四件事——原子提交、快照隔离、文件级统计裁剪、schema 与分区演进,并抽象出三家共有的『元数据指针 + 不可变数据文件』骨架。
拆解 Iceberg 的四层元数据:catalog 指针 → metadata.json → manifest list(snapshot)→ manifest file → data file。讲清 snapshot 与 manifest 里的分区数据和列级 stats(lower/upper bound、null/value count)如何让一次查询不 list 目录就收敛到文件集合,并给出表规范 V1/V2/V3 的版本边界。基于 pyiceberg 0.11.1 真实建表逐层 dump。
拆解 Iceberg 的 partition spec 与 transform(identity/bucket[N]/truncate[W]/year/month/day/hour/void):隐藏分区如何让查询不写分区列谓词也能裁剪,分区演进为何不重写历史数据(文件携带所属 spec),以及与 Hive 静/动态分区的本质差异。基于 pyiceberg 0.11.1 真实演进 spec 并观察新旧文件。
Iceberg 在不可变文件上做行级删除的两条路线:copy-on-write(重写整文件)与 merge-on-read(写 delete 文件,读时合并)。讲清 position delete 与 equality delete 的语义、字段与作用域规则,写放大/读放大的取舍,V2 delete file 到 V3 deletion vector(Puffin 承载)的差异与迁移,以及读路径如何把 data file 与 delete 合并出可见行。基于 pyiceberg 0.11.1 实测 CoW 写放大并观察 MoR 回退。
没有数据库进程,Iceberg 怎么在对象存储上做原子提交与并发控制?拆解提交=catalog 对元数据指针做 compare-and-swap,乐观并发如何基于当前 snapshot 生成新 snapshot、冲突按操作类型与隔离级别重试,不同 catalog 的原子性来源(DB 行锁/CAS、REST 后端、对象存储条件写、文件系统 rename),以及 REST Catalog 的 requirements+updates 提交语义。基于 pyiceberg 0.11.1 实测并发冲突与重试。
拆解 Delta Lake 的 _delta_log:有序 JSON commit 里的 add/remove/metaData/protocol/commitInfo/txn 七类 action、每 N 次 parquet checkpoint 与 _last_checkpoint、protocol 版本与 reader/writer table features、deletion vector(Delta 的 merge-on-read)、liquid clustering 与 Z-order,以及乐观并发如何完全基于日志做冲突检测。
拆解 Apache Hudi 的内核:CoW 与 MoR 两种表类型、.hoodie 下的 timeline 与 instant 三态、file group/file slice 的存储模型、base file 与 log file、compaction/clustering/cleaning,以及 bloom/simple/record-level/bucket 索引体系为何让 Hudi 强在 upsert,最后讲 snapshot/read-optimized/incremental 三种查询类型。锚定 Hudi 1.x 官方文档。
把前面 08–13 章拆过的 Iceberg、Delta、Hudi 放在一个坐标系里对照:元数据模型、行级更新、并发控制、引擎生态四维,每维标清口径。再讲两条互通路线——Delta UniForm(写时同步生成 Iceberg/Hudi 元数据)与 Apache XTable(事后转换元数据),以及它们的边界。最后给一棵按写入模式/引擎栈/更新频率展开的选型决策树,不做排名。
拆解 lakehouse catalog 的两件核心职责——表名到当前元数据指针的映射、以及原子提交点;对比 Hive Metastore、Iceberg REST Catalog、JDBC、Hadoop、Glue、Nessie、Gravitino 的锁与原子性语义,单列 Apache Polaris 与 Unity Catalog 开源后的形态、权限模型与 REST 规范互通。
讲清 Iceberg 的 snapshot 过期、回滚与按时间/快照读如何工作;schema evolution 为何按 field ID 而非位置来增删改名重排;以及演进对老数据文件与老 reader 的兼容边界与陷阱,附 PyIceberg 真实实验验证字段映射与时间旅行。
拆解 lakehouse 小文件的根因(频繁提交、流式、过细分区),以及 bin-pack、sort/z-order/clustering、rewrite manifests、expire snapshots、remove orphan files 这套治理操作;讲清 Puffin 中 Theta NDV sketch 对查询 planning 的作用,附 PyIceberg 真实实验对比 compaction 前后文件数与 planning 耗时。
拆解查询引擎读 Iceberg/Delta 的下推链路:partition pruning(manifest)→ file pruning(manifest stats)→ row-group/page pruning(Parquet column index)→ 字典过滤。对照 Trino/Spark/DuckDB/DataFusion/ClickHouse 的能力差异,讲清 planning 在哪一层完成、stats 从哪来,并用本机 pyiceberg + DuckDB 实测裁剪效果。
拆解流式数据进入 Iceberg/Delta/Hudi 的入湖侧机制:Flink/Kafka Connect/Spark sink 如何提交、exactly-once 怎样把引擎 checkpoint 与表格式的原子提交对齐、CDC 如何借 equality delete 与 record index 做 upsert,以及高频提交与小文件、compaction 的拉扯。只讲入湖侧,流处理引擎本身的窗口与状态留给后续。
把前面 19 篇的机制落到工程决策:从 Hive 表迁移到 Iceberg 的三条路径与风险、湖仓 benchmark 的口径陷阱、生产里最常见的故障模式(孤儿文件、元数据膨胀、提交冲突风暴、快照过期误删、catalog 单点),以及一份可执行的运维清单。
湖仓如何承接 AI 负载:embedding/特征/训练样本存湖、按 snapshot 固定数据版本做可复现训练,以及 Parquet 在随机访问和向量检索上的短板。用本机实测对比 Lance 与 Parquet 的顺序扫描与按行随机 take,讲清 Lance 为何为随机访问与向量而生,并划清湖侧存储与专用向量引擎的边界。
拆解 lakehouse 的两层基础:列式文件格式(Parquet/ORC/Arrow)与开放表格式(Iceberg/Delta/Hudi)。讲清没有数据库进程时,如何在对象存储上做 ACID、行级更新、快照与并发,以及 catalog、查询引擎、流式入湖如何拼成可运维的湖仓。面向数据平台工程师与从 OLAP/数仓转型的开发者。
InnoDB handler 边界、Master/Purge/IO/Page Cleaner 线程、内存布局与 srv0srv.cc 启动路径。
FIL 页头、Infimum/Supremum、聚簇/二级索引、ROW_FORMAT 与 rem0rec.h 行头字段。
Buffer Pool 实例、LRU 年轻/年老分区、flush 列表、buf_page_get 路径与 read-ahead。
Redo log buffer、LSN、checkpoint、mtr 记录类型与 innodb_flush_log_at_trx_commit 语义。
Undo segment、insert/update undo、purge 线程与长事务 history list 堆积机制。
Partial page write、doublewrite buffer 两阶段写与 8.0 doublewrite 文件变体。
DB_TRX_ID、DB_ROLL_PTR、Read View 构造与 RC/RR 可见性判断算法。
四种隔离级别、一致性读 vs 当前读、RR 下 gap lock 与幻读语义。
S/X/IS/IX、记录锁/间隙锁/Next-Key Lock、死锁检测与 MDL 分工。
recv_recovery 两阶段、checkpoint LSN、未提交事务回滚与启动路径。
从 btr0btr.cc 拆解 InnoDB B+Tree:聚簇索引即数据、二级索引回表、Page Directory、btr_cur_search_to_nth_level、页分裂 btr_page_split 与合并、索引 latch。对照 PG nbtree。
从 sql/binlog.cc 与 trx0trx.cc 拆解 binlog 与 InnoDB redo 的 XA 两阶段提交、ordered_commit 组提交、sync_binlog 与 innodb_flush_log_at_trx_commit 组合语义。
拆解 Dump/IO/SQL 线程、GTID、WRITESET 并行复制、半同步等待点与 Seconds_Behind_Master 陷阱。
从 handler.h 与 ha_innodb.cc 拆解 index_read、ICP、MRR、覆盖索引与 Server 优化器交界。
ibuf0ibuf.cc 延迟二级索引写、btr0sea.cc AHI 维护开销与 8.0 默认关闭 AHI 的工程背景。
精读 SHOW ENGINE INNODB STATUS 各段、performance_schema 事务/锁/内存表与 mysqld_exporter 关键指标。
长事务 undo 膨胀、flush 列表堆积、gap lock 死锁链、主从延迟——现象、机制、排查 SQL 与修复边界。
从 EXPLAIN ANALYZE、performance_schema、INNODB STATUS 到 iostat/perf 的分层调查方法论。
mysqldump 与 xtrabackup 机制差异、binlog PITR、GTID failover 与误删恢复边界。
innodb_buffer_pool_size、flush 参数组合、lock_wait_timeout、max_connections 等配置的症状与查验。
从线程模型到页格式、从 undo log MVCC 到 binlog 两阶段提交——对 MySQL InnoDB 做源码级拆解,并与 PostgreSQL 内核系列逐章对照。20 篇覆盖内核机制与生产运维实战,面向 MySQL DBA、从 PG 转 MySQL 的后端与数据库内核开发者。
拆解 PostgreSQL 多进程架构的核心:Postmaster 的启动与信号处理、Backend 进程的 fork()→InitPostgres→主循环生命周期、CreateSharedMemoryAndSemaphores() 的共享内存初始化流程、PGPROC/ProcArray/PGXACT 等关键共享内存结构的内存布局,以及 Background Worker 的注册与调度。理解了这个地基,才能理解 PG 为什么用进程而不是线程,以及 max_connections 为什么不能随便调大。
拆解 PostgreSQL 的物理存储层:Page 的 8KB 布局(PageHeaderData、ItemId 数组、special space)、HeapTupleHeaderData 的字段语义(xmin/xmax/ctid/t_infomask/t_infomask2)、TOAST 外存机制的压缩阈值与四种策略(PLAIN/EXTENDED/EXTERNAL/MAIN),以及用 pageinspect 扩展直接观察页面字节。理解页面格式是理解 VACUUM、Index Scan、MVCC 可见性判断的共同前提。
在已有 MVCC 文章基础上深入 PG 并发控制的三个基础设施:CLOG 的 SLRU 结构(事务状态位、页面格式、SLRU 淘汰)、hint bit 的写入时机和竞争问题(何时写、谁写、写坏了怎么办)、PG 14 snapshot scalability 优化的具体机制(ProcArrayLock 为什么是瓶颈、xid/xmin 的原子更新如何减少持锁路径),以及事务 ID 回卷(wraparound)的威胁模型。最后与 InnoDB undo log 方案做系统性对比。
拆解 PostgreSQL WAL 的完整内部机制:XLogInsert() 从分段锁到 WAL Buffer 的插入路径、XLogRecord 的物理布局(Header + Block Headers + Data)、Checkpoint 的两阶段流程与 IO 摊平算法、REDO 恢复的 RMGR 分发、wal_level 三级差异的 WAL 记录对比。运维部分聚焦 checkpoint IO 风暴的根因与 checkpoint_completion_target 的调优陷阱、max_wal_size 设小导致 WAL 段疯狂切换的机制,以及用 pg_waldump 定位问题 WAL record 的实操方法。
拆解 PostgreSQL Buffer Manager 的核心机制:shared_buffers 的内部组织(BufferDescriptors 数组、Buffer Table hash table、buffer pool)、Clock sweep 替换算法的完整源码路径、buffer 四态状态机与 pin/unpin 协议、bgwriter 的触发条件与脏页写入策略、BAS_BULKREAD/BAS_VACUUM ring buffer 的缓存隔离机制。用 pg_buffercache 实验观察 buffer 分布和 clock sweep 行为,解释为什么 shared_buffers 超过 8-10GB 后回报递减——double buffering、checkpoint IO 尖峰和 clock sweep 扫描延迟的三重反噬。
拆解 PostgreSQL 锁管理器的完整架构:SpinLock 自旋锁的硬件原语与使用边界、LWLock 从 PG 9.4 前到 PG 16 LWLockWaitListLock 的三代演进、Heavyweight Lock 的 LockAcquire() 完整路径和锁表结构、死锁检测 DeadLockCheck() 的等待图 DFS 算法、行级锁 FOR UPDATE/FOR SHARE/FOR KEY SHARE 的 t_infomask 实现,以及用 pg_locks 和 pg_blocking_pids() 追踪生产锁等待链的诊断方法。
拆解 PostgreSQL 事务系统的三层结构:事务状态机 TransState 的状态转换路径、子事务(savepoint)的 TransactionState 栈与 ResourceOwner 嵌套管理、两阶段提交(2PC)的 WAL 记录与 pg_twophase 状态文件格式、事务 ID 分配的 xidStopLimit/xidWrapLimit 防线。附带 2PC 泄露的排查 SQL 和子事务栈过深的故障案例。
拆解 PostgreSQL VACUUM 的完整内部流程:heap scan、dead tuple 回收、索引清理、FSM/VM 更新。深入可见性映射和空闲空间映射的结构设计,以及 Index-Only Scan 如何依赖 VM 判断页面全可见。解析 Freezing 机制与事务 ID 回卷防御,Autovacuum 的触发阈值和 cost-based delay。最后用一条从 n_tup_del 增长到数据库强制只读的完整危机时间线,讲清楚 Anti-wraparound VACUUM 的预警信号链、典型陷阱和排查方法。
拆解 PostgreSQL 查询编译的前两步:Parser 如何将 SQL 字符串转换为 RawStmt 语法树(基于 gram.y 的 Bison 语法文件),Analyzer 如何通过 parse_analyze() 完成表名/列名解析、类型推导和权限检查,Rewriter 如何基于 pg_rewrite 规则系统展开视图和行级安全策略,以及 Query 结构体中 rtable、jointree、targetList 等核心字段的含义。配合 debug_print_parse 和 debug_print_rewritten 参数,读者可以自己观察每一步的输出。
拆解 PostgreSQL 查询优化器的决策基础:pg_statistic 中 MCV/histogram/correlation 的存储结构、ANALYZE 的采样流程与精度边界、clauselist_selectivity 如何逐层估算选择率、seq_page_cost 等代价常量的物理意义与调优依据、CREATE STATISTICS 解决多列相关性问题、以及统计信息漂移的诊断 SQL 与排查路径。读完你能回答:优化器为什么选 Seq Scan 而不是你建的索引,以及怎么定位根因。
拆解 PostgreSQL 查询优化器的路径生成:make_one_rel() 从基表访问到 Join 路径的完整流程、四种扫描路径 (SeqScan/IndexScan/IndexOnlyScan/BitmapScan) 的创建条件、三种 Join 方式 (NestLoop/HashJoin/MergeJoin) 的代价比较与选择逻辑、动态规划到 GEQO 遗传算法的切换条件 (geqo_threshold)、并行路径的生成机制。配 EXPLAIN (ANALYZE, BUFFERS) 输出与 planner 内部决策的逐项对照实验。
拆解 PostgreSQL 执行器的火山模型(ExecInitNode→ExecProcNode→ExecEndNode)、Hash Join 内存化实现、EEO 表达式求值的 opcode 编译与解释执行机制、TupleTableSlot 的三种数据承载方式(virtual/heap/minimal)。附带查询 hang 住的完整诊断路径:pg_stat_activity 的 wait_event + pg_blocking_pids() 追踪锁等待链 + EXPLAIN ANALYZE 计划行数与实际行数差异定位。
拆解 PostgreSQL 的 LLVM JIT 编译机制:JIT 编译的触发决策流程(jit_above_cost 三级阈值)、LLVM 模块管理与惰性编译、表达式求值从 EEO opcode 到 LLVM IR 再到机器码的完整路径、Tuple 变形(deforming)的 JIT 加速原理,以及 JIT 在 OLAP 场景的实际加速效果、编译开销和适用边界。
拆解 PostgreSQL B-Tree 索引的内核实现:BTPageOpaque 页面布局(high key / rightlink 的工程意义)、_bt_doinsert() 插入路径与 _bt_split() 页面分裂的完整流程(分裂点选择不是简单的 50/50)、PG 12+ 去重(deduplicate_items)的触发条件与 posting list 压缩策略、B-Tree WAL 记录类型与恢复,以及用 bt_page_items() 和 bt_metap() 观察索引内部结构的实验方法。
拆解 PostgreSQL GiST 索引的抽象算子接口(Consistent/Union/Penalty/PickSplit)、深度优先搜索与 Consistent 过滤的组合逻辑、Penalty 引导插入路径与 PickSplit 决定分裂策略的完整流程,以及 point_ops 的几何距离搜索和 tsvector_ops 的全文搜索两种典型实现。读完你会理解为什么 GiST 能用一个通用框架支持十几种数据类型,以及它什么时候比 B-Tree 好、什么时候该用 GIN 替代。
拆解 PostgreSQL GIN 索引的内部结构:entry tree、posting list、posting tree 三者各在什么条件下使用;Fast Update 的 pending list 设计与 gin_clean_pending_list 合并时机;gingetbitmap() 的 bitmap AND/OR 多关键词搜索合并流程;全文搜索 tsvector 与数组 _int4 的 GIN 实现;以及 GIN 与 GiST 在写性能、读性能、存储开销上的三角权衡和具体场景下的选择建议。
过一遍 BRIN 索引的范围摘要哲学——用每个 page range 一条摘要替代逐行索引,在 1TB 的表上创建时间从小时降到秒级。同时讨论两条"不建 B-Tree"的高性价比路径:Hash 索引在 PG 10+ 的 WAL 安全边界和 Bloom 索引的多列任意组合过滤。附带代价对比表和建索引决策树。
拆解 PostgreSQL 流复制的完整内核路径:WAL Sender 的 WalSndLoop→XLogSendPhysical 发送链路、WAL Receiver 的 WalRcvLoop 接收与恢复链路、同步复制的三种语义与等待机制、Failover 时 Timeline 的 fork 原理与 split-brain 风险、Primary-standby 冲突的本质与 max_standby_streaming_delay 的 trade-off、Replication Slot 的内部结构。重点剖析 Slot 溢出多米诺效应——standby 宕机→slot 阻止 WAL 回收→pg_wal 填满磁盘→primary PANIC 的完整事件链,以及 wal_keep_size 与 slot 的互相影响。配合 pg_stat_replication 的三层延迟指标排查与 conflict_reason 解读。
拆解 PostgreSQL 逻辑复制的完整内核路径:LogicalDecodingContext 从 WAL 解码出逻辑变更的内部流程、Reorder Buffer 按 COMMIT 顺序重排事务与 snapshot 重建机制、pgoutput 输出插件的二进制协议与行过滤变换、Publication/Subscription 模型的内核实现。重点剖析四种冲突类型的根因与修复边界——update_missing/delete_missing 为什么静默跳过而 duplicate_key 直接停摆、subscription 被 disable 后的数据追平策略、序列不在逻辑复制范围内的自增主键冲突陷阱、大事务在 reorder buffer 中的延迟放大效应。
拆解 PostgreSQL 扩展系统的两种核心机制:全局 hook 机制全景(planner_hook、ExecutorStart_hook、ProcessUtility_hook 等覆盖七个子系统)和 FDW(Foreign Data Wrapper)的 FdwRoutine 回调接口。重点分析 postgres_fdw 的 pushdown 机制——哪些 WHERE/ORDER BY/LIMIT 能推到远端执行、哪些被留在本地——以及扩展如何通过 GetForeignRelSize→GetForeignPaths→GetForeignPlan 三个回调影响 planner 的代价估算和路径选择。
不从 Grafana 模板照抄,而是从 PG 内核机制推导出必须监控的六个维度:连接与 wait_event、存储膨胀与 XID wraparound、WAL 与复制延迟、查询性能突变、锁等待链、以及 shared_buffers 命中率骗局。每个维度配具体 SQL 和指标解读,告警阈值给出内核依据而非拍脑袋数字,同时盘点 pg_stat_statements queryid 冲突、track_io_timing 开销、pg_stat_activity 自身代价等监控工具本身的陷阱。
拆解 PG 生产环境中最危险的五种故障模式——连接风暴与 work_mem 连锁效应、事务 ID wraparound 危机完整时间线、replication slot 溢出多米诺效应、OOM 连锁 kill、长事务 idle in transaction 隐性破坏。每个故障给出可复现的触发方法、Mermaid 时序图标注事件节点和排查断点、排查 SQL 脚本和修复边界,以及监控埋点策略让下次提前发现而非事后救火。
不是工具箱罗列,而是一条按顺序推进的调查链:从 pg_stat_statements 定位可疑 queryid,到 EXPLAIN (ANALYZE, BUFFERS) 解剖执行计划,到 pg_stat_activity + wait_event 诊断等待类型,到 pg_locks + pg_blocking_pids() 追踪锁等待树,最后用 OS 层工具(iostat/perf/bpftrace)确认物理瓶颈。覆盖三个特殊场景:计划缓存的快慢切换、CPU 100% 无慢查询的 LWLock 自旋根因、命中率 99% 但 IO 打满的统计骗局。
拆解 PostgreSQL 数据恢复路径的内部机制与操作边界:PITR 的三个关键窗口与 timeline fork 原理、pg_checksums 的校验粒度与盲区、pg_resetwal 的 hint bit 代价与 VACUUM FULL 陷进、pg_dump 并行调度的内部策略。重点在于每种操作做什么、不做什么、哪些后果不可逆。
拆解 pg_upgrade 的三种模式(--link 硬链接零拷贝、--clone CoW 快照、--copy 物理复制)的执行流程、内部机制和不可回滚的根本原因;逻辑复制跨版本迁移的低停机方案及序列/large object/DDL 三大盲区;四种常见坑的根因与应对;附带迁移方案决策树,从小库到大库选哪种方案一次说清。
逐一拆解 11 个最容易被误解和配错的 PostgreSQL GUC 参数:shared_buffers 的 double buffering 反噬、work_mem 作为'每个操作'而非'每个查询'的内存炸弹、effective_cache_size 和 random_page_cost 如何误导优化器走向灾难计划、fsync=off 和 synchronous_commit=off 的数据丢失边界、huge_pages 在容器中的静默退化、maintenance_work_mem 不足导致 VACUUM 瘫痪、idle_in_transaction_session_timeout 为什么必须设、log_lock_waits 与 deadlock_timeout 的联动、以及 log_min_duration_statement 与 auto_explain 的日志洪水叠加。每条配查验 SQL 和 shell 命令——不是'设成 X 就好了',而是'通过什么视图和日志确认当前设置有问题'。
从进程模型到磁盘页面、从 MVCC 到流复制——对 PostgreSQL 内核做完整的源码级拆解。不止步于源码分析:26 篇中 6 篇是运维实战——经典故障的根因与排查路径、性能调查的五层工具链、配置陷阱与恢复边界。面向想读懂 PG 内核源码、在生产环境排查过问题、准备给 PG 贡献代码的工程师。
从工作负载隔离到行列双维护,系统梳理 TiDB + TiFlash、SingleStore Universal Storage、F1 Lightning 与 Lakehouse 的设计取舍、新鲜度边界与 HTAP 基准测试方法
从 Aurora 的日志即数据库到 Neon 的 pageserver/safekeeper/compute 三层分离,拆解 Serverless 数据库的冷启动、细粒度伸缩与 copy-on-write 分支,并给出本地可跑的 Neon demo 指引
从 Aurora 到 Socrates、PolarDB、Taurus:系统梳理四家云数据库的存算分离架构共同点与差异——日志即数据库、页面服务器、缓存层级、故障恢复与工程踩坑
从 FaRM、FaRMv2、NAM-DB 到 Sundial:RDMA 单边操作如何重塑分布式事务协议;CXL 让共享内存再次成为可能时,系统设计又该怎么变
以 System R、Postgres、Bigtable、Spanner、Snowflake 等关键节点串起 50 年数据库史,勾勒 2026 年 AI-Native、向量检索、HTAP 云原生、新硬件、隐私计算、新范式、方法论七条主线,并给出 25 篇系列文章的完整阅读地图。
回顾 AI-Native、向量检索、HTAP 云原生、新硬件、隐私、新范式、方法论七条主线,给出面向负载的开发者选型决策矩阵,并列出 12 个仍未解决的开放问题与待观察方向。
把 Apache Iceberg、Apache Hudi、Delta Lake 放在同一张表上比较:metadata layout、snapshot isolation、多写者 OCC 协议、schema 与 partition evolution,最后给出 iceberg vs hudi 选型矩阵与对象存储上的事务边界。
从顶会定位、检索渠道、三遍读法到工业与学术论文的辨别方法,给出 2023–2025 年数据库领域可信必读二十篇,并配套 CMU 15-721、Stanford CS 245 等公开课清单。
系统梳理 Neo、Bao、Balsa 以及新兴 LLM-assisted 查询优化的核心思想,结合 PostgreSQL pg_hint_plan 给出一条可落地的 learned QO 工程路径
从 Kraska 2018 RMI 到 ALEX、PGM-Index、RadixSpline,系统梳理学习型索引的数学骨架、更新代价与落地边界,并给出一个最小 RMI 的 Python 实现
从 Peloton、NoisePage、OtterTune 到 Aurora / Azure SQL 的自动索引推荐,系统回顾自治数据库十年,并讨论云上 auto-tuning 的踩坑与 SRE 工作流集成
把数据库当 LLM 长期记忆的系统视角:GPTCache、MemGPT、向量 vs 事实记忆;用 pgvector + 触发器实现会话级一致性语义缓存
系统拆解 HNSW、DiskANN/Vamana、SPANN 三类主流 ANN 索引的原理、构建算法、查询流程与工程参数,并覆盖 IVF-PQ、ScaNN 的位置,最后给出 FAISS/Milvus/pgvector/Qdrant 的选型与一份 200 行 numpy HNSW 复现。
系统拆解 ANN 混合过滤检索(filtered vector search)里的 pre-filter、post-filter、in-filter 三种策略,覆盖 ACORN(SIGMOD 2024)的预测路由、Milvus/Qdrant 的 partition / pinned filter,以及 pgvector 的实际查询写法和 EXPLAIN 观察方法。
系统梳理 Microsoft GraphRAG(2024)的动机、算法与工程实现:多跳问答为什么让向量 RAG 失效、图作为 evidence path 的优势、社区检测与报告生成、Neo4j / NebulaGraph / KuzuDB 的落地差异,以及一个 NetworkX 最小实现。
系统梳理 LanceDB、Chroma、Weaviate、SurrealDB 等多模态数据库的架构差异;列存格式(Lance、Parquet)如何支持张量;给出多模态一体化的选型矩阵,并与仓库的 Parquet/Arrow 文章互链。
从 CXL 1.1 到 3.0 的协议演进、Type 1/2/3 设备分类,到 Pond、TPP 两篇 ASPLOS 2023 论文展示的云内存池化实践,再到 PostgreSQL / MySQL 在分层内存下的 buffer pool 调参方向,梳理 CXL 对数据库共享内存模型的重塑路径。
从近数据处理(NDP)的基本动机出发,梳理 Samsung SmartSSD、ScaleFlux、Eideticom 等 computational storage 产品,SNIA 计算存储标准,BlueField DPU 对存储路径的改造,以及 YourSQL、POLARDB-NDP 等学术/工业工作;下半给出过滤、解压、CRC、加密这四类当前能真正落地的下推场景,并借 PostgreSQL FDW 的类比说明'下推'到底在下推什么。
Intel Optane / 3D XPoint 产品线 EOL 之后,SOFORT、FPTree、RECIPE 等 PM 数据库的成果如何迁移?ZNS SSD 对 LSM-Tree 的意义、RocksDB 的 ZNS 适配、PMDK 兼容层的取舍,以及把 CXL memory 作为下一代非易失载体的可能性——本文给出一份面向工程师的'后 Optane 时代'清单。
从 SGX / SEV-SNP / TDX / ARM CCA 的硬件抽象出发,梳理 EnclaveDB、Opaque、ObliDB 三条研究主线,以及侧信道攻击对 TEE 数据库设计的约束;下半讨论 Azure Confidential SQL、AWS Nitro Enclaves 上做 OLAP 的工程边界与性能开销量级。
从 Dwork 2006 的差分隐私定义出发,梳理 PINQ、FLEX、APEx 三篇里程碑论文;讲清 Laplace、Gaussian、Exponential 三类噪声机制与组合定理;回顾美国 2020 人口普查的 DP 落地教训;下半给出 OpenDP / Google DP library 的 SQL 绑定现状与 Postgres 上聚合加噪的最小 demo。
梳理 FHE(BFV/BGV/CKKS、Microsoft SEAL、OpenFHE)、可搜索加密与 Private Information Retrieval(SealPIR、OnionPIR、Spiral)三条加密查询路线;讨论哪些查询形态在当前开销下可行——点查可以、join 不行——以及银行与医疗场景的真实落地模式。
以 CALM 定理、单调性与 coordination-free 判定为主线,重读 CRDT 十五年工程化进程,串起 Bloom/Hydro、VLDB 2025 \"Keep CALM and CRDT On\"、Yjs、Automerge、Riak DT,并给出业务侧的可协调性判定清单
从零实现 LSM-Tree Compaction:最小堆多路归并迭代器、Level 分层与 Compaction 打分、Tombstone 下推、Version/VersionEdit/MANIFEST 版本管理,以及 Leveled/Size-Tiered/Universal 三种策略的量化对比。从零写一个 LSM-Tree 存储引擎系列第 4 篇。
组装完整 LSM-Tree 存储引擎:DB 接口(Open/Put/Get/Delete/Iterator/Snapshot)、单写多读并发控制、启动恢复,然后用 Rust 重写核心模块,记录 5 个编译器不让我过的故事,最后三方 benchmark 对比。从零写一个 LSM-Tree 存储引擎系列第 5 篇。
从零理解 LSM-Tree 存储引擎的设计哲学:B-Tree 与 LSM-Tree 的本质差异,写放大/读放大/空间放大的三角权衡,以及 WAL、MemTable、SSTable、Compaction、Bloom Filter 各组件的角色与协作关系。从零写一个 LSM-Tree 存储引擎系列第 1 篇。
从零实现 SSTable 和 Bloom Filter:Data Block 前缀压缩与 restart 二分查找、Bloom Filter 双重哈希把误判率压到约 1%、SSTable Builder 和 Reader 的完整 C 代码。从零写一个 LSM-Tree 存储引擎系列第 3 篇。
从零实现 WAL 和 MemTable:WAL 的 record 格式与 32KB Block 对齐、跳表的 O(log n) 插入与查找、InternalKey 编码、崩溃恢复的正确性证明。从零写一个 LSM-Tree 存储引擎系列第 2 篇。
关系数据库范式详解:第一、第二、第三范式原理与数据库设计最佳实践
LevelDB 缓存实现解析:LRU 算法在 Key-Value 数据库中的应用与优化
LevelDB 使用指南:Google 开发的高性能 Key-Value 数据库实践教程
从 PostgreSQL 源码级别拆解 MVCC 的实现机制:堆表版本链、事务快照、可见性判断规则、VACUUM、隔离级别的真实行为,以及 Snapshot Isolation 抓不住的 Write Skew 和 SSI 如何解决它。附 MySQL InnoDB vs PostgreSQL MVCC 对比。
MVCC 靠什么实现?持久化 B-tree、COW、append-only log。从 CouchDB 到 LMDB 到 DuckDB,三种不同的路径,同一个目标:读不阻塞写。
数据库高可用实践:通过冗余实现 MariaDB 高可用,MTTF/MTTR 分析与实战
Redis 源码分析:高性能内存数据库的设计与实现,原子操作与数据结构
拆解 SQLite 的三层性能引擎:B-Tree 页面布局如何把随机 I/O 压到最低、WAL 如何实现读写并发、Page Cache 如何替代操作系统的盲目预读。附 SQLite vs MySQL vs PostgreSQL 嵌入式场景对比分析。
五篇长文,从 LSM-Tree 的设计哲学讲到完整 KV 引擎实现,最后用 Rust 重写并三方 benchmark 对比。每篇含完整 C 代码、架构图、数学推导。