数据库内核实验索引
汇总本站数据库内核文章:PostgreSQL / MySQL InnoDB / 列存、湖仓、流处理、查询引擎、RocksDB、向量、Redis、全文检索、TiKV/HTAP、FoundationDB、SQLite 与 WiredTiger 内核,以及 LSM-Tree 实验与其它单篇。
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
共 23 篇文章 · 返回首页
汇总本站数据库内核文章:PostgreSQL / MySQL InnoDB / 列存、湖仓、流处理、查询引擎、RocksDB、向量、Redis、全文检索、TiKV/HTAP、FoundationDB、SQLite 与 WiredTiger 内核,以及 LSM-Tree 实验与其它单篇。
钉住 SQLite table b-tree 与 index b-tree 的字节布局差异、cell pointer array 如何做到逻辑有序物理可乱序、overflow 阈值与 balance() 分裂/合并触发条件;源码以 btree.c 函数签名为准,学术锚点是 Bayer & McCreight 1972。
给出相对 PG/InnoDB/SQLite/RocksDB 的选型决策树,回收 History Store 与 cache 公平性等开放问题,并收束 WiredTiger 内核 17 篇阅读地图。
定位单文件嵌入式行存在服务器行存与 LSM 嵌入 KV 之间的生态位;钉住 SQLite 架构约束、站内分工与 17 篇阅读路线,并以 Bayer/McCreight、官方 file format、PVLDB 2022 为学术锚点。
拆解 SQLite 单文件格式:100 字节 database header 与 B-Tree 页面头的逐字段布局,用本机 3.53.2 CLI 实测 hexdump 核对 magic、page size、页类型标志,并钉住 file format 官方规范与 Bayer/McCreight 谱系。
拆解 Pager 作为 B-Tree 与操作系统文件之间的契约层:page cache 命中/未命中路径、脏页生命周期与提交前的可回滚保证,并与 PG shared_buffers、InnoDB Buffer Pool 的跨进程共享模型对照。
钉住 SQLite 把 SQL 编译成 bytecode、由 sqlite3_step 驱动虚拟机执行的路径:指令格式、寄存器、B-Tree 游标与 ResultRow;用本机 3.53.2 EXPLAIN 走通一次点查,编译管线细节留给第 6 篇。
拆开 sqlite3_prepare_v2 内部如何把 SQL 文本经词法、语法、名字解析、查询规划变成第 5 篇执行的 bytecode;用本机 3.53.2 的 EXPLAIN QUERY PLAN 钉住三种访问路径形态,并交代 schema cookie 触发 reprepare 的机制,规划算法细节留给第 11 篇。
钉住 SQLite 默认的原子提交机制:写前把原页拷进 -journal、DELETE/TRUNCATE/PERSIST 三种提交点如何实现、cache spill 何时把 journal 变成真正的 hot journal;用本机 3.53.2 实测崩溃恢复全过程,WAL 对照留给第 8 篇。
钉住 SQLite WAL 模式如何反转 rollback journal 的读写关系:原始内容留在主文件、新内容追加到 -wal,checkpoint 才把帧搬回主文件;用本机 3.53.2 实测 journal_mode=WAL 切换与 passive/truncate checkpoint 的真实帧数,读放大与 checkpoint 频率的取舍留作开放问题。
钉住官方 File Locking And Concurrency 文档定义的 UNLOCKED/SHARED/RESERVED/PENDING/EXCLUSIVE 五态锁阶梯:谁能与谁共存、PENDING 如何防写者饿死、Pager 为何只跟踪四态;用本机 3.53.2 真实双连接冲突实验验证,shared cache 与 WAL 差异只点边界,留给第 8、10 篇。
拆解 BEGIN DEFERRED/IMMEDIATE/EXCLUSIVE 三种模式的取锁时机差异,对照 Berenson et al. SIGMOD 1995 的隔离词汇与官方 Isolation In SQLite 文档;说明单写者约束下 WAL 快照为何天然回避 write skew,并用本机 3.53.2 实测三种 BEGIN 均可提交。
钉住 EXPLAIN QUERY PLAN 的 SEARCH/SCAN 判定、ANALYZE 写入 sqlite_stat1/stat4 的具体语义,以及没有统计时 SQLite 用什么默认猜测(表大小猜一百万行、重复度猜 10);对照官方 N3 join 排序算法与 PG 式穷举代价优化器的复杂度边界,本机 3.53.2 实测覆盖两条 EQP 路径。
钉住 covering index 消除的具体开销:第 4 篇 index b-tree 只存 key+rowid,命中后仍要回表这一次二次查找;用本机 3.53.2 实测 SELECT 列是否全部落在索引内如何改变 EQP 输出,并区分语句级自动索引与 sqlite_autoindex_* 约束索引这两个常被混淆的概念。
钉住 ATTACH DATABASE 的命名空间规则、super-journal 如何让跨文件事务在 rollback journal 模式下保持原子,以及官方文档明确写明的一条反常识边界:main 库或任一 attached 库切到 WAL 后,跨库事务只在单文件粒度原子,崩溃中间态可能只改了一部分文件;本机 3.53.2 实测跨库 JOIN、跨库事务提交与 DETACH 锁冲突。
拆解 PRAGMA integrity_check/quick_check 的检查范围与复杂度差异,对照官方 How To Corrupt Your Database Files 列出的四类常见损坏来源;用本机 3.53.2 实测一个刻意损坏的数据库,比较 .recover 与 .dump 在数据丢失时的真实行为差异,钉住“修复=尽力抢救,不是万能恢复”的边界。
拆解 sqlite3_backup_init/step/finish 与 CLI .backup 如何在不停机的前提下拿到一致快照;用本机 3.53.2 实测 .backup 后备份库 count(*)=3、integrity_check=ok,并实测对比:在写事务打开期间用 cp 拷贝主文件,物理文件已经比头部记录的逻辑页数更大。
用进程模型、日志、锁与缓冲池四轴对照 SQLite 与 PostgreSQL / InnoDB:说明嵌入式单文件如何删掉服务器层,以及同名 WAL、隔离、缓存概念为何不能平移运维经验;不写跨库吞吐排名。
用部署形态、写并发、查询形态与持久化需求收束 SQLite / PostgreSQL·InnoDB / DuckDB / RocksDB 选型;给出站内阅读地图、全系列学术谱系与开放问题,标志 SQLite 内核系列完成。
补齐嵌入式行存内核层:从单文件格式、Pager/B-Tree、VDBE 到 Rollback Journal/WAL、锁状态机与计划器,并以 PG/InnoDB、DuckDB、RocksDB 对照收束;承接 sqlite-billion-rows 性能叙事。
梳理 FoundationDB 存储引擎谱系:SIGMOD 2021 时代的 SQLite 派生 SSD Engine 如何把 SQL 剥掉只留 B-Tree,再到 7.x 的 Redwood 多版本前缀压缩 B-Tree;划清无本地事务 WAL 的系统边界,并与 RocksDB LSM 对照机制而非性能排名。
当我们提到"数据库"时,多数人首先想到的是 MySQL、PostgreSQL 这类以独立进程运行的数据库服务器。客户端通过网络协议连接到服务器,服务器管理存储、索引、事务和并发控制。然而,还有一类存储系统以库(Library)的形式直接链接到应用进程中,不需要独立的服务器进程,不需要网络通信,不需要序列化和反序列化——…
拆解 SQLite 的三层性能引擎:B-Tree 页面布局如何把随机 I/O 压到最低、WAL 如何实现读写并发、Page Cache 如何替代操作系统的盲目预读。附 SQLite vs MySQL vs PostgreSQL 嵌入式场景对比分析。