知其然更要知其所以然,聊聊SQLite软件架构( 二 )


SQLite文件格式前文我们简要的介绍了一下SQLite的软件架构以及每个组件的基本功能 。接下来我们介绍一下数据库文件的相关功能 。
在SQLite中一个文件承载着一个数据库实例 , 这个文件称为主库文件(main database file) 。除了主库文件外 , 还可能有一些其它文件 , 比如用于事务的日志文件等 。本文主要集中介绍主库文件 , 其它文件后续介绍 。

数据库文件由多个页构成 , 每个页的大小在512到65536字节之间 , 且大小必须是2的幂 。页通过编号进行标记 , 起始值为1 , 最大编号为2的31次幂-2 。页的默认大小是4KB , 本文以默认大小为例进行介绍 。

知其然更要知其所以然,聊聊SQLite软件架构

文章插图
 
在数据库中的每个页都有一个特定的用途 , 这些用途包括:
  • 锁字节页(Lock-byte page)
  • 剩余 页
  • B树 页
  • 指针映射页
  • 有效负载溢出页
数据库文件的第一个页是比较特殊的 , 它包含整个数据库文件的描述信息 , 这里称为数据库头信息 。
数据库头
数据库头包含100个字节的内容 , 其中每一个成员的偏移 , 大小和功能如下图所示 。
知其然更要知其所以然,聊聊SQLite软件架构

文章插图
 
我们可以创建一个数据库实例 , 然后对照文件内容与数据库头的格式进行理解 。比如数据库头的第一个成员为一个魔数 , 用于标识该文件为SQLite数据库文件及版本 。在下图中可以找到该信息 , 可以看出两者完全匹配(SQLite format 3) 。
知其然更要知其所以然,聊聊SQLite软件架构

文章插图
 
除了上述数据库头的格式外 , 每个不同的页都有不同的布局 。限于篇幅 , 本文暂时不过多介绍 , 后面结合实例专门写一篇文章介绍各种不同的页的布局 。
 
参考内容[1] https://www.cnblogs.com/YSPXIZHEN/p/5792459.html
[2] https://sqlite.org/index.html
[3] https://www.runoob.com/sqlite/sqlite-c-cpp.html
[4] https://sqlite.org/fileformat.html




推荐阅读