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条记录。
版权声明:本文标题:SQLite数据库文件格式全面分析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1714497546a682844.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论