思想准备
这是我第一篇博客,同时也是我第一次“解剖”轻型库——SQLite。其实以前听闻SQLite,但一直以来都使用的是MySQL。因此在分析SQLite背后代码的实现过程中,也是学习一门新技术的过程。我相信,这条路一定是苦尽甘来的…
SQLite介绍
SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2021年已经接近有21个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
结构分析
初步了解,SQLite分为以下几个部分:界面、分词器、解析器、代码生成器、字节码引擎、B树、缓存页面、操作系统接口。它又可以大致可以分为一下几个部分:前段, 中层VM, 后端。"前端"主要做的是语法分析, "后端"主要实现了数据库性质(ACID, 增删查改)。后端分为了tree, pager, os三层。
主要任务
我主要负责解析Pager模块的代码(初步暂定)。
Pager(页面缓存):前端解析完SQL命令后,需要对数据库进行操作时,会通过B-Tree模块查找需要的页面,B-Tree维护着磁盘各页面之间的复杂关系,B-Tree不会直接读写磁盘,它会通过调用pager模块来获取所需的页面或修改页面,pager模块的作用可以说是B-Tree和磁盘读写的中间代理。
B-tree 模块以固定大小的页面从磁盘请求信息。默认的page_size是 4096 字节,但可以是 512 到 65536 字节之间的任何 2 的幂。页面缓存负责读取、写入和缓存这些页面。页面缓存还提供回滚和原子提交抽象,并负责锁定数据库文件。B-tree 驱动程序从页面缓存中请求特定页面,并在它想要修改页面或提交或回滚更改时通知页面缓存。页面缓存处理所有杂乱的细节,以确保快速、安全和高效地处理请求。
|