除了内存数据库,SQLite存储一整个数据库在一个单独的数据库文件。
在他的生命周期以内,这个数据文件能够增加或者收缩。
一个数据库文件能够增加到操做系统限制的文件大小。
操做系统的原生文件系统对待这个数据库文件就像一个普通的文件同样。
文件系统并不理解文件的内容,他看这个文件就仅仅是一系列的字节串。
他仅仅提供原生的读或者写文件中的任何大小的字节数据,这个字节数据能够从任何偏移量的位置开始读写。
他仍然提供文件上的刷新同步操做。
下面的章节咱们将会讨论一个数据库文件是如何组装成逻辑的页面的,而且这些页面是如何组织的。sql
3.2.1 page的抽象
为了方便空间管理以及从数据库文件中读写数据。
SQLite划分每一个数据库文件(包含内存型数据库)成为固定大小的区域,被称为数据库页或者简称为页。
所以,一个数据库文件的大小一直是page大小的整倍数。
page的编号线性增加且从1开始,第一个page被称为page1 第二个page被称为page2 以此类推。
page编号0被当作NULL PAGE 或者"不是一个page",由于这个page物理上是不存在的。
page1和后面的page都线性的存储在一块儿,一个接着一个,文件从偏移量0开始计数。
你能够把这个数据库看作一个可变大小的数组,该数组中的元素是固定大小的数据库页。
而且这个数据库页的编号被用做数组的下标来获取这些page
事实上,pager模块创造了这个抽象的概念在原生的文件系统之上。
数据库
3.2.2 Page大小
默认的page大小是1024字节,可是这个是编译时可定制的参数。
你能够修改这个值当你使用源码编译SQLite的库时。
page大小必须是2的倍数,且范围在512 到 65536范围内,两边边界都包括。
后面的边界范围是由于存储page size的变量是一个2字节的无符号整形变量。
一个数据库文件能够拥有2147483647个page(2的31次方 -1),这个数值是硬编码在PAGER_MAX_PGNO 宏位于pager.c源文件数组
所以,一个数据库能够最大有140Tb字节大小 2的16次方 * 2的31次方大小 字节 固然,受制于sqlite所暴露的原生的文件系统。编码
修改Page大小: 一旦一个数据库文件被建立,SQLite使用编译时设置的默认page大小,可是你能够修改这个page大小经过page_size pragma 命令 在建立数据库中的第一个table以前.操作系统
SQLite存储这个page_size设置的大小做为文件的一个元数据。
在工做时他将会使用这个page size的大小而不是默认的大小。
数据库会完美的工做甚至之后你使用了一个不一样的SQLite 库,该库在编译时定制化了不一样的默认page大小.net
3.2.3 Page types
SQLite对全部的为数据库文件分配的page保持着监测,不管这些page如今是否正在被使用。他保持着引用信息用于追踪。他负责对全部的page的管理以确保没有孤悬在外的不受控制的page存在,由于SQLite当中不存在垃圾回收的设计。
针对他们的用处不一样,pages 被区分为四种类型,free tree pointer-map lock-byte
Tree pages 又能够分为叶子页 内部页以及溢出页
free pages 是不活跃的pages 或者是当前未被使用的pages;其他的是活跃的pages而且他们归属于B-或者B+树
还有就是pointer-map 和 lock-byte pages
B+树的内部页包含有查找树中叶节点的方向性信息。
B-Tree 的内部页包含有查询性信息以及数据
叶子页在B+树当中存储着真实的数据。
若是一行数据太大以致于一个大单独的page存储不下,只有部分数据将会存储在树的page中,其他的数据将会存在到一个或者多个溢出页中设计
https://blog.csdn.net/qq_37940313/article/details/80474266sqlite