Tree 模块:在 SQLite 中将页面转化为行

发布: (2026年2月6日 GMT+8 05:16)
7 min read
原文: Dev.to

Source: Dev.to

(请提供您希望翻译的正文内容,我将把它翻译成简体中文并保持原有的 Markdown 格式。)

从分页器到树

在前一章中,我们停在了 分页器
分页器为 SQLite 提供了一件极其重要但也非常有限的东西:对字节流的 基于页的视图

你可以请求第 17 页,对其进行修改、固定、解固定——但分页器根本不知道 记录 是什么。

正是这段空白让 树模块 介入。

树模块将这种扁平的、基于页的世界转换为 VM 能够理解的形式:基于元组、键序列的文件

从此以后,VM 不再以页为单位思考,而是以 元组 为单位——有序、可搜索、可插入的数据单元。

Source:

什么是 SQLite 中的元组?

在继续之前,值得放慢脚步并澄清一个非常常见的混淆。

  • SQLite 中的元组不是一种数据类型
  • 它也不是 C 结构体、不是行对象,也不是树模块试图语义化解释的东西。

元组仅仅是:

  1. 由虚拟机(VM)看到的关系的逻辑行,在内部表示为可变长度的字节序列
  2. 被树模块视为不透明数据

换句话说,树模块不关心元组代表的是:

  • 带有列的表行,或
  • 带有 key + rowid 的索引条目。

sqlite_master 的元数据是单独存储的。对树模块而言,所有这些都只是带有关联键的字节串。意义是由树模块之上的层次(主要是 VM 和记录格式逻辑)强加的。

为什么元组需要组织

一个关系在概念上是 元组的集合,但仅靠集合不足以实现高效访问。虚拟机(VM)需要以下保证:

  • 通过键查找元组
  • 按顺序扫描元组
  • 高效插入和删除元组
  • 即使在同一文件中,也要将不同关系的元组分开

组织元组的经典方式包括:

  • 条目序列(仅追加)
  • 相对定位
  • 基于哈希的组织
  • 键序列组织(SQLite 的选择)

每种选择都会影响插入、查找和删除的行为。

SQLite的“一大”设计决策:一切皆树

SQLite 只使用 一种组织技术 来存储持久化数据:

结构用途
B⁺‑trees
B‑trees索引

没有哈希表,没有堆文件,没有聚簇的二级结构。每个关系——无论是表还是索引——都 拥有自己的树

后果

  • 每棵树对应 一个关系或索引
  • 所有树都位于 同一个数据库文件 中。
    • 不同树的页面可以在磁盘上交错存放。
    • 没有任何单页会同时包含来自多个树的元组。

最后一点至关重要。虽然页面在文件层面是共享的,但 所有权 在树层面是严格的。确保这一点是树模块的主要职责之一。

从页面导向到树导向

它公开的内容
Pager编号页面的集合
Tree Module支持有序访问以及元组级别插入、删除和查找的 面向树的文件

内部,树模块:

  • 选择哪些页面属于哪个树
  • 维护父/子关系
  • 确保 B⁺ 树的平衡属性
  • 决定何时对页面进行拆分或合并

对分页器而言,页面仅仅是页面。对树模块而言,页面是 节点

树模块是有意被动的

一项细微但重要的设计选择:树模块是结构上活跃但语义上被动的。

关注的内容不关注的内容
键、排序、页面布局、树的平衡、导航列类型、SQL 模式、约束、元组中字段的含义

树元数据的存放位置

SQLite 仍然需要一种方式来回答以下问题:

  • 哪棵树属于哪个表?
  • 这棵树的根页在哪里?
  • 这棵树是表还是索引?

这些映射信息存储在一个特殊且众所周知的关系中:

  • sqlite_master(临时对象使用 sqlite_temp_master

这个目录本身也存放在一个 预定的 B⁺‑树 中,和其他所有数据一样。SQLite 并没有通过将元数据存放在系统“外部”来投机取巧——它自己也使用自己的数据结构。

我们接下来要去的方向

到目前为止,我们已经建立了宏观概念:

  • Pager → 页面
  • Tree module → 元组
  • VM → SQL 语义

在接下来的几天里,我们将进一步聚焦并具体化:

  1. 树接口函数 – VM 实际如何与树交互
  2. B⁺树结构 – 内部节点、叶子节点、分隔符
  3. 页面结构 – 元组在单个页面内如何打包、索引和导航

那时,图示开始变得有意义,SQLite 设计的真正优雅也随之显现。

需要持续记住的关键理念: SQLite 将字节文件转换为页面,页面转换为树,树转换为关系——一次一个干净的层次。

我的 SQLite 实验和动手执行示例位于此:
lovestaco/sqlite – sqlite‑examples

参考文献

[![FreeDevTools 截图](https://media2.dev.to/dynamic/image/width=800,height=,fit=scale-down,gravity=auto,format=auto/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o5e57lh7rtwwwe2d694n.png)](https://hexmos.com/freedevtools/)

👉 **查看:** [FreeDevTools](https://hexmos.com/freedevtools/)

欢迎提供任何反馈或贡献!  
它是在线的、开源的,随时可供任何人使用。

**在 GitHub 上给它加星:** [FreeDevTools 仓库](https://github.com/HexmosTech/FreeDevTools)
Back to Blog

相关文章

阅读更多 »

Litestream 可写 VFS

请提供您希望翻译的具体摘录或摘要文本,我将为您翻译成简体中文。