该系列的前面一些文章我重点讲了sqlite的核心功能,比如封锁机制,共享缓存,以及事务管理等。但对于sqlite的整体没有作一个全面的介绍,本文将从实现的层面,整体介绍sqlite的框架、各个核心模块以及功能。后续再针对核心模块作进一步的分析。我们说sqlite是一个关系型的嵌入式数据库。提到关系型数据库,我们会想到诸如oracle,mysql,sqlserver等主流数据库,它们的核心功能点在于支持SQL,支持事务;提到嵌入式数据库,我们会想到berkeleyDB,sqlite,它们核心在于嵌入式,即作为应用程序的一部分,没有独立的进程。Sqlite当然具有以上特性,那么这些特性在sqlite中如何实现,有哪些模块实现呢?

图1

如图1,Sqlite由7个模块组成,分别是词法分析器(Tokenizer),解析器(Parser),代码生成器(Code generator),虚拟机(Virtual machine),Tree模块,Pager模块以及OS接口。前面3个模块主要用于解析SQL语句或者命令,后面四个模块则主要用于执行。虽然各个数据库的模块划分可能千差万别,但基本功能是一致的。为了解析SQL,一定有词法+语法分析+语义分析;为了能执行SQL语句,一定需要先生成执行计划,并通过优化器选择最优的执行计划;为了实现事务的ACID特性,一定有事务管理模块,并发控制模块和故障恢复模块等。其实说白了就是这么些东西,针对sqlite,我们看看这些核心的功能分别是由具体哪个模块实现的。

Tokenizer:将SQL语句进行分词

Parser:将词法分析器的输出作为它的输入,结合语义(利用元数据判断,比如表是否存在),生成一个语法树,并最终转换化为执行计划树,这个过程中包含了通过优化器选择最佳路径。所以说整个词法分析+语法分析+语义分析+代价优化都在Parser这个模块中实现。

Code generator:将执行计划树生成虚拟机指令集,这个是sqlite比较独特的地方,主要为虚拟机做准备。

Virtual machine:通过执行代码生成器产生的指令集,来执行SQL语句满足用户的需求。通过操作数据库文件中的记录,来查询或修改数据。

The tree:将用户的记录通过B树结构来管理,每个用户表通过一个B+树管理,每个索引通过一个B树管理。VM通过tree模块实现从Btree中查询、插入、删除、更新记录,或者创建/删除一个Btree等。所有这些操作接口都有tree模块封装。VM执行指令时,直接调用接口即可。

The pager:在tree模块看来,所有的B树的节点都是在内存中的,tree模块不直接与数据库文件打交道。Pager模块负责直接与数据库文件交互,它管理缓存,并负责内外存交互。同时它还负责并发控制和故障恢复。所以pager模块是sqlite中核心模块之一,事务的ACID特性全部靠pager模块实现。

The operating system interface:针对不同的操作系统,提供统一的操作文件接口。Pager模块并不关心底层的硬件和操作系统,在它看来,只需要调用统一的接口就能达到读写文件的目的。当然不仅限于此,除了文件IO,mutex,sleep,随机数生成的统一接口也是该模块封装的。

可以看到,sqlite每个模块的功能边界非常清晰,模块间虽相互依赖,但耦合度很低,因此sqlite扩展相对容易。麻雀虽小,五脏俱全用在sqlite身上再合适不过了,哈哈!

SQLite学习笔记(八)&&sqlite实现架构的更多相关文章

  1. Sqlite学习笔记(五)&&SQLite封锁机制

    概述 SQLite虽然是一个轻量的嵌入式数据库,但这并不影响它支持事务.所谓支持事务,即需要在并发环境下,保持事务的ACID特性.事务的原子性,隔离性都需要通过并发控制来保证.那么Sqlite的并发控 ...

  2. SQLite 学习笔记

    SQLite 学习笔记. 一.SQLite 安装    访问http://www.sqlite.org/download.html下载对应的文件.    1.在 Windows 上安装 SQLite. ...

  3. SQLite学习笔记(七)&&事务处理

    说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性.对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性.sqlite也不例外,虽然简单,依然 ...

  4. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  5. Sqlite学习笔记(四)&&SQLite-WAL原理(转)

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  6. sqlite学习笔记7:C语言中使用sqlite之打开数据库

    数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...

  7. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  8. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  9. Angular快速学习笔记(2) -- 架构

    0. angular 与angular js angular 1.0 google改名为Angular js 新版本的,2.0以上的,继续叫angular,但是除了名字还叫angular,已经是一个全 ...

随机推荐

  1. Pointer is missing a nullability type specifier (__nonnull or __nullable)

    我们都知道在swift中,可以使用!和?来表示一个对象是optional的还是non-optional,如view?和view!.而在Objective-C中则没有这一区分,view即可表示这个对象是 ...

  2. 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  3. selenium操作隐藏的元素

    有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: Python 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操 ...

  4. 彻底解决低端安卓手机touchend事件不触发(考虑scroll)

    本次移动端开发时遇见了安卓4.2系统不能触发touchend的问题,有以下需求. 1. 横滑轮播图 2.下拉刷新页面内容 3.body滚动条不能失效 开始在轮播图touchmove事件中阻止了浏览器默 ...

  5. 7.5 数据注解特性--MaxLength&&MinLength

    MaxLength attribute can be applied to a string or array type property of a domain class. EF Code Fir ...

  6. 常用的WebForm 控件

    首先回忆一下Html页中的12个表单元素 .文本类 文本框 <input type="text" id="" name="" valu ...

  7. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  8. 学习笔记之-------UIScrollView 基本用法 代理使用

    //contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. // 滚动 self.ScrollView.contentSize =sel ...

  9. 突如其来的"中断异常",我(Java)该如何处理?

    一.何为异常? 1.生活中的实例 生活中存在许多不正常: 上班路上自行车掉链子 上厕所手机掉马桶 下班回家钥匙丢失 ....... 2.程序中的实例 我们的代码中也许存在许多纰漏,导致用户使用时程序突 ...

  10. MySQL中优化sql语句查询常用的30种方法

      1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...