用途
storage-format 是 tursodatabase/turso 仓库中的一份存储格式说明文档,用于描述 SQLite 文件格式以及该格式在 tursodb 中的实现方式。它面向需要理解数据库磁盘布局、B-tree 组织方式、页与单元格编码规则的开发者,可作为阅读与调试 tursodb 存储层代码时的参考材料。
主要能力(按文档内容)
- 数据库文件结构:第 1 页包含头部与 schema,其中前 100 字节为数据库头部,第 2 至 N 页为 B-tree 页,另包含溢出页与空闲页。
- 页大小:为 2 的幂,范围 512-65536 字节,默认 4096。
- 数据库头部字段:文档以偏移、长度、字段的形式列出,包括魔数 "SQLite format 3\0"(偏移 0,长度 16)、页大小(偏移 16,长度 2,大端)、写格式版本(偏移 18,1=rollback,2=WAL)、读格式版本(偏移 19)、变更计数器(偏移 24,长度 4)、数据库页数(偏移 28,长度 4)、第一个空闲 trunk 页(偏移 32,长度 4)、空闲页总数(偏移 36,长度 4)、schema cookie(偏移 40,长度 4)、文本编码(偏移 56,长度 4,1=UTF8,2=UTF16LE,3=UTF16BE)。文档注明所有多字节整数均为大端序。
- 页类型标志:内部索引页 0x02、内部表页 0x05、叶子索引页 0x0a、叶子表页 0x0d,以及溢出页和空闲页。
- B-tree 结构:分为表 B-tree(64 位 rowid 键,存储行数据)与索引 B-tree(任意键,即索引列加 rowid)。文档给出内部页和叶子页的示意结构,并说明第 1 页始终是 sqlite_schema 表的根。
- 单元格格式:表叶子单元格为 [payload_size: varint] [rowid: varint] [payload] [overflow_ptr: u32?];表内部单元格为 [left_child_page: u32] [rowid: varint];索引单元格结构类似,但键为任意(列加 rowid),而非仅 rowid。
- 记录格式(负载):[header_size: varint] [type1: varint] [type2: varint] ... [data1] [data2] ...,并列出序列类型含义:0 为 NULL,1-4 为 1/2/3/4 字节有符号整数,5 为 6 字节有符号整数,6 为 8 字节有符号整数,7 为 IEEE 754 浮点数,8 为整数 0,9 为整数 1,大于等于 12 的偶数为 BLOB(长度=(N-12)/2),大于等于 13 的奇数为文本(长度=(N-13)/2)。
- 溢出页:当负载超过阈值时,超出部分存入溢出链,格式为 [next_page: u32] [data...],最后一页的 next_page 为 0。
- 空闲链:由 trunk 页组成的链表,每个 trunk 页包含叶子页号,格式为 [next_trunk: u32] [leaf_count: u32] [leaf_pages: u32...]。
使用方式(Turso 实现与调试)
文档列出 Turso 实现的关键文件:core/storage/sqlite3_ondisk.rs(磁盘格式、PageType 枚举)、core/storage/btree.rs(B-tree 操作,文档标注为大文件)、core/storage/pager.rs(页管理)、core/storage/buffer_pool.rs(页缓存)。
文档给出的调试存储命令如下:
# Integrity check
cargo run --bin tursodb test.db "PRAGMA integrity_check;"
# Page count
cargo run --bin tursodb test.db "PRAGMA page_count;"
# Freelist info
cargo run --bin tursodb test.db "PRAGMA freelist_count;"
文档参考项列出 SQLite File Format、SQLite B-Tree Module、SQLite Internals: Pages & B-trees。
适用场景
适合需要了解 SQLite 磁盘格式细节、排查 tursodb 存储层问题、或在阅读 tursodb 存储相关源码(页、B-tree、pager、buffer pool)时查阅的开发者。
限制
资料仅描述文件格式与实现位置,未说明收费、价格、平台支持范围、性能指标或具体版本兼容性;这些信息暂未提供。