【SQLite 内核】嵌入式行存全景:单文件、单写者、零 IPC

💡 原文中文,约8500字,阅读约需21分钟。
📝

内容提要

本文为SQLite内核系列首篇,介绍其嵌入式行存数据库的定位:单文件、页式B-Tree、VDBE执行引擎及文件级单写者约束。对比PG/InnoDB服务器行存、RocksDB LSM与DuckDB列存,强调零IPC带来短调用链而非无引擎。规划17篇阅读路线,涵盖Pager、B-Tree、WAL、锁等机制,并锚定学术谱系与开放问题。

🔎

延伸解读

零 IPC 的代价:并发模型与服务器引擎不同

SQLite 的“零 IPC”意味着查询路径只是函数调用,没有网络协议栈和跨进程缓冲池。但这不等于没有并发:多读者可并行,WAL 模式下读写可重叠。真正的限制是同一时刻通常只有一个写者,写事务按文件粒度串行化。因此,不能把 PostgreSQL 的行级锁心智模型直接搬过来,选型时需评估写并发需求。

单文件既是便利也是风险

SQLite 将整个数据库放在一个普通文件中,备份和拷贝简单,但“库”与文件生命周期绑定。文件损坏、部分写或错误的热拷贝都会直接影响文件格式。因此,生产环境需关注文件完整性,依赖 journal 或 WAL 机制,并避免在非推荐文件系统(如 NFS)上使用。

嵌入式不等于没有执行引擎

SQLite 将 SQL 编译为 VDBE 字节码,再通过虚拟机执行,这并非“解释执行”。它把执行引擎链进应用进程,热路径是函数调用。相比服务器数据库,它省去了进程调度和缓冲池协作,但保留了完整的 SQL 解析、优化和执行能力。

常见误解:SQLite 不是玩具,但也不是万能

SQLite 广泛用于移动 OS、浏览器等生产环境,但“能否生产”取决于工作负载是否匹配单写者与单机文件语义。它的 WAL 与 PostgreSQL 的 WAL 语义不同,不能平移运维经验。RocksDB 提供 KV 存储,但缺少 SQL 引擎,不能直接替代。

Q&A

SQLite 的“零 IPC”具体指什么?它带来了哪些工程后果?

SQLite 的“零 IPC”指查询时不需要跨进程通信:没有 socket、没有连接池线程、没有独立数据库守护进程,调用链直接从应用代码进入解析/字节码,再经 Pager 取页、B-Tree 定位记录。工程后果包括:没有网络协议栈(无握手、无编解码、无连接线程池);没有跨进程共享缓冲池(Page Cache 在本连接/本进程语义下工作,多进程靠 OS 文件锁协调);写者数量有硬边界(同一数据库文件同一时刻通常只有一个写者)。

SQLite 的“单写者”约束是什么意思?它和“单线程”有什么区别?

SQLite 的“单写者”指同一数据库文件上的写互斥,通过锁状态机实现:多个读者可持 SHARED 锁,写路径升到 RESERVED/PENDING/EXCLUSIVE。它不是“整个进程只能跑一个线程”,多线程多连接可以并存,但写锁按文件粒度串行化写事务。这与 PostgreSQL 的行级锁并发模型不同。

SQLite 的存储引擎是 B-Tree 还是 LSM?它和 RocksDB 的 LSM 有什么本质区别?

SQLite 使用页式 B-Tree(Bayer & McCreight, 1972 奠基),表与索引落在 B-Tree 页上。RocksDB 使用 LSM(Log-Structured Merge-Tree,O’Neil et al., 1996)。区别在于:随机点查与短事务通常适合页式索引,而高吞吐顺序写与压缩策略适合 LSM。SQLite 不提供 SQL 引擎,而 RocksDB 是 KV 存储,没有 SQL、优化器与表约束。

SQLite 的 VDBE 是什么?它在查询执行中扮演什么角色?

VDBE(Virtual Database Engine)是 SQLite 的虚拟机执行引擎。SQL 文本通过 sqlite3_prepare_v2 编译成 VDBE 程序(字节码),然后 sqlite3_step 推进虚拟机执行。这样 SQL 文本不在热路径上反复“解释执行”,而是生成可移植的字节码程序。嵌入式并不等于没有执行引擎,VDBE 把执行引擎链进了应用进程。

SQLite 的 WAL 和 PostgreSQL 的 WAL 有什么区别?

名字相同但语义不同:SQLite 的 WAL 是单文件库上的写前日志与 checkpoint 协议,用于改善读写重叠;PostgreSQL 的 WAL 服务服务器集群的崩溃恢复与复制。不能把运维经验直接平移。

SQLite 适合在哪些场景使用?它有哪些常见误解?

SQLite 适合需要 SQL 与事务语义、但不想或不能跑独立数据库进程的场景,如手机本地库、桌面应用、边缘设备、测试夹具和小型服务内嵌状态。常见误解包括:认为 SQLite 没有并发(实际上多读者可并行,WAL 模式下读写可重叠);认为 SQLite 只是玩具(实际上嵌入式生产面极广);认为 SQLite 的 WAL 等于 PostgreSQL 的 WAL(语义不同);认为嵌入 RocksDB 就能替代 SQLite(RocksDB 不提供 SQL 引擎)。

SQLite 的学术谱系包括哪些关键论文?

关键论文包括:Bayer & McCreight 1972 年提出的 B-Tree(有序索引范式);O’Neil et al. 1996 年提出的 LSM-Tree(日志结构写优化分叉);Berenson et al. 1995 年对 ANSI SQL 隔离级别的批判;以及 Gaffney et al. 2022 年发表的《SQLite: Past, Present, and Future》(PVLDB),讨论嵌入式 SQL 在分析负载上的瓶颈与演进。

SQLite 的“单文件”特性有什么优缺点?

优点:备份与拷贝心智简单,数据库就是一个普通文件(加上 journal 或 -wal/-shm 附属文件)。缺点:库与文件生命周期绑死,损坏、部分写、错误的热拷贝都会直接打在文件格式上。

🏷️

标签

➡️

继续阅读