admin 管理员组

文章数量: 1087139


2024年5月1日发(作者:前端工程师自我介绍面试)

SQLite数据库文件格式全面分析

作者:空转

0 前言

性急的兄弟可以跳过前言直接看第1章,特别性急的兄弟可以跳过前面各章,直接看鸣谢。

最近对SQLite数据库很感兴趣,认真地学了有半个多月了,越学越觉着好玩。好玩归好玩,

只是目前没什么实际用途,那就写点儿东西吧,否则半个月不是白学了嘛!

SQLite数据库包括多方面的知识,比如VDBE什么的。据说那些东西会经常变。确实,我

用的是3.6.18版,我看跟其它文档中描述的3.3.6的VDBE已经很不一样了。所以决定先写

文件格式,只要是3.?.?的版本,文件格式应该不会有太大变化吧。

网上介绍SQLite文件格式的文章并不少,但一般都是针对小文件:一个表,几条记录,两

个页。本文准备一直分析到比较大的文件,至少B-tree和B+tree中得有内结点(就是说不能

只有一个既是根又是叶的结点,就是说表中得多点记录,得建索引),还要争取对SQLite的

各类页都做出分析。

在分析的过程中,争取把SQLite数据库关于文件格式的基本规定也都介绍一下。这样,本

文既是一个综合性的技术文档,又带有实例说明,兄弟们参考时岂不是就很方便了吗?

既然是技术文档,要想读懂总得先掌握点SQLite数据库的基本知识吧。所以,先介绍参考

文献。

0.1 参考文献

1-The Definitive Guide to SQLite . Michael Owens:据说是比较经典的SQLite著作,我看写得

是挺好的。边看边翻译了其中的主要部分,但不敢拿出来,大家还是看原文吧。

2-SQLite源代码:其实有关SQLite的最原始说明可能都在源代码中了。把此项列在第2,

只是因为我是先看的书再看的代码,估计大家也会是这个顺序吧。先浏览一下代码还是很有

收获的,特别是几个主要的.h文件,对本文的写作很有帮助。有关文件格式的说明主要在

btreeInt.h中。

3-SQLite入门与分析 :网上Arrowcat的系列文章。Arrowcat应该是一个很博学的人,看他

的文章收获很大,在此也算是鸣谢吧。

4-SQLite . Chris Newman:我没看,因为也是网上能够下载到的重要资源,所以也在此列出。

看目录内容应该比参考文献1简单一些,但出版日期也更早了一些。

5-NULL:在网上搜了半天,国内为什么就没有关于SQLite的好书呢?

6- /:如果这篇文章看懂了,其实我这篇东西根本就不用再

看了。这是介绍SQLite文件格式的权威文档,列在最后,是因为我也是写完这篇东西后才

看到的。该文档由SQLite官方网站提供,当初没看,一是因为上网少,还没仔细浏览人家

的网站就开始干了(太激动),其实归根结蒂还是因为英语不好。看到此文档这后还敢把我的

东西发出来,有两个原因:一、为其他英语比我强不了多少的兄弟提供一点方便,二、我这

里有例子,看起来更形象一些吧。

0.2 术语

这里不集中讨论大量术语了,那样显得太正式,还真成“文章”了。绝大多数术语都是在出

现时再进行简单解释,但还是有个别概念需要先说明清楚,比如:

(1) Btree、B-tree和B+tree:

Btree是为磁盘存储而优化了的一种树结构,其一般性说明可参考各类《数据结构》教材。

根据实现方法的不同,Btree又分为很多类型。在SQLite中,存储表数据用的是B+tree,存

储表索引用的是B-tree。由于历史原因,SQLite在3.0版以前只使用B-tree,从3.0版开始,

才对表数据使用了B+tree。因此,在SQLite的官方文档中,有时B-tree表示存储表索引的

B-tree,有时又是两种Btree的统称。本文中将两种Btree的概念加以了区分,而将Btree作

为两种树的统称,这是与SQLite官方文档及当前大多数SQLite介绍性文档相区别的地方。

(2) auto-vacuum数据库:

一般情况下,当一个事务从数据库中删除了数据并提交后,数据库文件的大小保持不变。即

使整页的数据都被删除,该页也会变成“空闲页”等待再次被使用,而不会实际地被从数据

库文件中删除。执行vacuum操作,可以通过重建数据库文件来清除数据库内所有的未用空

间,使数据库文件变小。但是,如果一个数据库在创建时被指定为auto_vacuum数据库,当

删除事务提交时,数据库文件会自动缩小。使用auto_vacuum数据库可以节省空间,但却会

增加数据库操作的时间,有利有弊。Auto_vacuum数据库需要使用附加的格式,如指针位图

页,本文只讨论非auto_vacuum数据库。

(3) 数据库映像、数据库文件和日志文件:

“数据库映像”是SQLite数据库的磁盘映像。SQLite数据库存储在单一的“数据库文件”

中。一般情况下,数据库映像和数据库文件是一致的,可以理解为数据库映像就是数据库文

件的内容,但有例外。如果事务对数据库进行了修改,这些修改会暂存在“日志文件”中,

此时可以认为数据库映像分布在数据库文件和日志文件两个文件中。日志文件有自己的格

式,本文不涉及。

(4) SQLite的当前版本:

我写这篇东西时,SQLite的当前版本为3.6.18。等我写完时,已经变成3.6.19了,文件格式

没变。

1 小文件的分析

1.1 准备数据库

执行SQLite的命令行工具,创建一个新的数据库food_。

D:SQLiteCLP>sqlite3 foods_

创建一个新表。

CREATE TABLE foods(

id integer primary key,

type_id integer,

name text );

插入2条记录。


本文标签: 数据库 文件 文档 说明 映像