【SQLite 内核】单文件 · Pager · B-Tree · VDBE · WAL · 锁

💡 原文中文,约4000字,阅读约需10分钟。
📝

内容提要

该文章是SQLite内核系列的技术指南,涵盖17篇内容,从单文件格式、Pager缓存、B-Tree分裂到VDBE字节码、WAL日志和锁状态机。文章提供阅读路径和依赖关系,适合嵌入式工程师或从PG/InnoDB转来的读者,帮助理解SQLite的存储、并发与选型对比。

🔎

延伸解读

阅读路径设计

文章提供了多条阅读路径,如必读核心、持久化与并发、执行与计划等,方便不同背景的读者快速定位。从PG/InnoDB转来的读者可先读第1、16、17篇,快速建立对照;而想深入查询路径的读者则从第5、6、11、12篇入手。这种依赖关系图清晰展示了各篇之间的逻辑顺序,有助于高效学习。

版本锚定与实验严谨性

系列明确锚定SQLite 3.45.x–3.46.x,并强调实验只使用实际运行过的CLI或绑定,不伪造跨库性能排名。这种对版本和实验的严谨态度,保证了技术内容的准确性和可复现性,读者在参考时也应注意版本差异,避免因版本更新导致行为变化。

与相邻系列的分工

文章通过表格清晰划分了与性能叙事、服务器行存、LSM嵌入KV、列存分析等系列的分工,避免重复。例如,性能单篇负责“为什么快”,本系列则深入“路径怎么走”;与PG/InnoDB的对照集中在第16-17篇。这种分工有助于读者按需选择阅读,构建完整的知识体系。

Q&A

SQLite 内核系列文章主要涵盖哪些主题?

该系列文章涵盖 SQLite 内核的多个方面,包括单文件格式、Pager 缓存、B-Tree 遍历与分裂、VDBE 字节码、SQL 编译管线、Rollback Journal 与 WAL、锁状态机、事务模式、查询计划器、索引、ATTACH、完整性检查、在线备份,以及与 PG/InnoDB/DuckDB/RocksDB 的选型对比。

SQLite 的锁状态机允许什么级别的并行?

SQLite 的锁状态机定义了 SHARED、RESERVED、PENDING、EXCLUSIVE 等锁状态,允许在 SHARED 状态下多个读并发,但写操作需要升级到 RESERVED 或 EXCLUSIVE,从而限制写并发,实现单写者多读者的并发模型。

Rollback Journal 和 WAL 模式在读写并发和恢复路径上有何不同?

Rollback Journal 模式在写事务开始时创建回滚日志,通过写时拷贝实现原子提交,但读写并发受限;WAL 模式使用预写日志,允许读操作与写操作并发进行,通过 checkpoint 机制合并日志,提高了并发性能并改善了恢复路径。

SQLite 的 Pager 层在数据库操作中扮演什么角色?

Pager 层是 B-Tree 与操作系统文件之间的契约层,负责管理页面缓存、处理缓存命中/未命中、脏页生命周期,并确保提交前的可回滚性。它类似于 PG 的 shared_buffers 和 InnoDB 的 Buffer Pool,但 SQLite 是进程内单写者模型。

SQLite 的 VDBE 字节码是如何执行 SQL 语句的?

SQLite 将 SQL 语句编译为 VDBE 字节码程序,通过 sqlite3_step 循环执行,使用寄存器和游标操作数据。VDBE 是 SQLite 执行引擎的核心,负责解释执行字节码,完成查询和修改操作。

SQLite 的 B-Tree 是如何组织数据和索引的?

SQLite 使用 B-Tree 结构组织表和索引,表 B-Tree 和索引 B-Tree 在字节布局上有所不同。B-Tree 通过 cell 指针数组实现逻辑有序,物理上可以乱序,并通过 balance() 函数处理节点分裂和合并,以维持平衡。

SQLite 与 PostgreSQL/InnoDB 在架构上有哪些主要区别?

SQLite 是嵌入式数据库,单文件、单写者、零 IPC,而 PostgreSQL 和 InnoDB 是服务器数据库,使用多进程/线程、共享缓冲池和独立 WAL 来支持高并发。SQLite 没有独立的服务进程,所有操作在进程内完成,而 PG/InnoDB 有独立的服务器进程和复杂的锁管理。

SQLite 的 WAL 模式如何实现 checkpoint?

WAL 模式使用 -wal 和 -shm 文件,写操作追加到 WAL 文件,checkpoint 将 WAL 中的帧合并回主数据库文件。checkpoint 可以自动或手动触发,策略包括 PASSIVE、FULL 和 RESTART,以控制合并的时机和影响。

🏷️

标签

➡️

继续阅读