Storage Format

tursodatabase/turso/.claude/skills/storage-format

作者 tursodatabaseff97ec42cdef无许可证24K 个星标收录于 2026年10月9日更新于 2026年10月8日仓库今天更新

SQLite file format, B-trees, pages, cells, overflow, freelist that is used in tursodb

AI 生成的概览

介绍 Turso 所用 SQLite 磁盘文件格式的参考指南,涵盖 B 树、页、单元格、溢出页与空闲列表。

功能
该技能是一份参考文档,说明 SQLite 数据库文件格式:100 字节数据库头、页类型、表与索引 B 树结构、单元格与记录编码、溢出页链以及空闲列表。它还将这些结构对应到 Turso 的实现文件,并列出用于检查数据库的 PRAGMA 命令。它产出的是解释说明,而不是文件或代码。
适用场景
当你需要理解或解释 SQLite 或 Turso 如何在磁盘上存储数据时使用,例如读取原始页、调试存储层行为,或解读头部字段与页类型。
运行要求
不需要脚本或工具,仅为说明与参考资料。调试示例假定已安装 Rust 工具链和 tursodb 可执行文件,参考资料链接指向外部文档。

Storage Format Guide

Database File Structure

┌─────────────────────────────┐│ Page 1: Header + Schema     │  ← First 100 bytes = DB header├─────────────────────────────┤│ Page 2..N: B-tree pages     │  ← Tables and indexes│            Overflow pages   ││            Freelist pages   │└─────────────────────────────┘

Page size: power of 2, 512-65536 bytes. Default 4096.

Database Header (First 100 Bytes)

OffsetSizeField
016Magic: "SQLite format 3\0"
162Page size (big-endian)
181Write format version (1=rollback, 2=WAL)
191Read format version
244Change counter
284Database size in pages
324First freelist trunk page
364Total freelist pages
404Schema cookie
564Text encoding (1=UTF8, 2=UTF16LE, 3=UTF16BE)

All multi-byte integers: big-endian.

Page Types

FlagTypePurpose
0x02Interior indexIndex B-tree internal node
0x05Interior tableTable B-tree internal node
0x0aLeaf indexIndex B-tree leaf
0x0dLeaf tableTable B-tree leaf
-OverflowPayload exceeding cell capacity
-FreelistUnused pages (trunk or leaf)

B-tree Structure

Two B-tree types:

  • Table B-tree: 64-bit rowid keys, stores row data
  • Index B-tree: Arbitrary keys (index columns + rowid)
Interior page:  [ptr0] key1 [ptr1] key2 [ptr2] ...                   │         │         │                   ▼         ▼         ▼               child     child     child               pages     pages     pages
Leaf page:     key1:data  key2:data  key3:data ...

Page 1 always root of sqlite_schema table.

Cell Format

Table Leaf Cell

[payload_size: varint] [rowid: varint] [payload] [overflow_ptr: u32?]

Table Interior Cell

[left_child_page: u32] [rowid: varint]

Index Cells

Similar but key is arbitrary (columns + rowid), not just rowid.

Record Format (Payload)

[header_size: varint] [type1: varint] [type2: varint] ... [data1] [data2] ...

Serial types:

TypeMeaning
0NULL
1-41/2/3/4 byte signed int
56 byte signed int
68 byte signed int
7IEEE 754 float
8Integer 0
9Integer 1
≥12 evenBLOB, length=(N-12)/2
≥13 oddText, length=(N-13)/2

Overflow Pages

When payload exceeds threshold, excess stored in overflow chain:

[next_page: u32] [data...]

Last page has next_page=0.

Freelist

Linked list of trunk pages, each containing leaf page numbers:

Trunk: [next_trunk: u32] [leaf_count: u32] [leaf_pages: u32...]

Turso Implementation

Key files:

  • core/storage/sqlite3_ondisk.rs - On-disk format, PageType enum
  • core/storage/btree.rs - B-tree operations (large file)
  • core/storage/pager.rs - Page management
  • core/storage/buffer_pool.rs - Page caching

Debugging Storage

bash
# Integrity checkcargo run --bin tursodb test.db "PRAGMA integrity_check;"
# Page countcargo run --bin tursodb test.db "PRAGMA page_count;"
# Freelist infocargo run --bin tursodb test.db "PRAGMA freelist_count;"

References

来源与署名

来源:tursodatabase/turso位于.claude/skills/storage-format提交ff97ec4

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架