SQLite是一个非常受欢迎的数据库 , 在数据库排行榜中已经进入前十的行列 。这主要是因为该数据库非常小巧 , 而且可以支持linux、windows、IOS和Andriod的主流的操作系统 。
![知其然更要知其所以然,聊聊SQLite软件架构](http://img.jiangsulong.com/220422/0F15J160-0.jpg)
文章插图
SQLite非常简单 , 是一个进程内的动态库数据库 。其最大的特点是可以支持不同的语言来使用 , 比如C、C++、JAVA等等 。同时 , SQLite还是一个开源的数据库 , 也就是开发者可以根据自己的需求来修改数据的功能特性 。
SQLite虽然非常小巧 , 但功能却非常丰富 , 正所谓“麻雀虽小 , 五脏俱全” 。SQLite不仅具备基本的SQL特性 , 还具备索引、触发器、视图和事务等特性 。
SQLite的主要APISQLite提供两种访问接口 , 一种是通过sqlite命令行工具 , 另外一种是通过动态库 , 也就是API函数 。在学习SQLite架构之前 , 我们有必要对其API进行一个简要的介绍 。其实SQLite的API很简单 , 主要包括三个 , 分别是sqlite3_open、sqlite3_exec和sqlite3_close三个函数 。其中sqlite3_exec则是用于执行SQL语句的函数 。
也就是说sqlite3_exec是SQLite功能的关键入口 , 我们后面分析代码也应该以此函数作为突破点 。其它函数相对简单 , 也没那么重要 。
SQLite整体架构首先我们从整体架构上介绍一下SQLIte 。其架构如图所示 , 包括接口层、SQL命令处理器和存储后端等 。
![知其然更要知其所以然,聊聊SQLite软件架构](http://img.jiangsulong.com/220422/0F15J010-1.jpg)
文章插图
最为核心的不是就是SQLite内核了 。其中包括接口层、SQL命令处理器和虚拟机三部分 。SQL命令处理器负责对用户的SQL进行预处理 , 最终生成适用于虚拟机执行的代码 。
其下是后端部分 , 后端部分相当于存储引擎 。下面我们简要的介绍一下每个模块的功能 。
接口
SQLIte库的使用通过函数调用实现 。为了避免与其它库出现冲突 , SQLite的函数都以sqlite3作为前缀 。接口部分的实现在文件main.c,legacy.c和vdbeapi.c中 。其中main.c中包含其主要的接口 , 包括sqlite3_open、sqlite3_config和sqlite3_close等等 。SQLite中最终的函数不在main.c中 , 而是在legacy.c中 , 该文件中只包含这一个接口的实现 。
词法分析器
词法分析器对SQL语句字符串进行解析 , 最终生成单词(token)序列 。并且将生成的单词序列传给解析器进行下一步的动作 。该功能的具体实现在文件tokenize.c中 , 核心入口函数为sqlite3RunParser 。
解析器
SQLite的解析器基于Lemon实现 , 它实现将SQL语句字符串解析成语法树 。Lemon是一个与YACC/BISON类似的词法分析库 。该库的源代码在tool目录中 。
代码生成器
代码生成器用于生成与SQL语句对应 , 可以在虚拟机执行的代码 。代码生成器实现比较复杂 , 包含的文件有:build.c, delete.c, attach.c, expr.c, insert.c, pragma.c, select.c, auth.c等等 。通过文件名可以看出 , 这里很多文件其实分别对应着一个SQL语句 , 比如delete , insert和select等 。
【知其然更要知其所以然,聊聊SQLite软件架构】虚拟机
SQL的具体执行在一个称为虚拟机的组件中进行的 , 这个在前面架构图中已经有所展示 。虚拟机执行的代码有前面代码生成器产生 。虚拟机的实现在文件vdbe.h和vdbe.c中 。
B-树
SQLite的数据通过B树进行组织管理 。每个表或者索引都有一个对应的B树 。所有的B树存储在一个数据库文件中 。B树的具体实现在btree.c和btree.h文件中 。
页缓存
SQLite的文件被划分为等份大小 , B树也是以该大小为粒度来对数据进行管理 。页缓存是该粒度对应的内存内容 , 通过该内存实现对数据块的读写等访问 。页缓存相关的实现在pager.c和pcache.c等文件中 。
操作系统接口
SQLite是一个跨平台的数据库 , 其存储数据需要兼容Windows和Linux的文件系统API 。为了方便 , SQLite实现了一个抽象层 。这样对于SQLite业务逻辑来说 , 只需要调用该抽象层的接口即可 , 而不用关心操作系统 。
基础库
包含一个被各个模块都可能使用到的基础库 , 比如内存分配 , 字符串处理等 。
推荐阅读
- 粉色|人到中年更要懂得爱自己!在这4个地方多下点功夫,老了也有魅力
- 夜晚能够“制氧”的5种花,卧室小更要养一盆
- 你适合披头发还是扎头发,主要取决于这3个特点,脸大更要注意
- 西湖龙井开茶节启幕 今夏更要拍西湖龙井茶
- 陈郁榕,茶企要做强做大更要做久做稳
- 详细讲解象棋走法口诀,知其然知其所以然,看一遍就能记住
- 会喝茶 更要会泡茶
- 天猫旗舰店主体变更流程 天猫店主体变更要求是什么
- 年轻人更要注重夏季养生 来看常犯的5大禁忌
- 都是脂肪肝,为什么有的没事,有的成了癌?只有胖人会得?瘦子更要当心