该系列的前面一些文章我重点讲了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. ManagementClass类解析和C#如何获取硬件的相关信息

    在.NET的项目中,有时候需要获取计算机的硬件的相关信息,在C#语言中需要利用ManagementClass这个类来进行相关操作. 现在先来介绍一下ManagementClass类,首先看一下类的继承 ...

  2. jQuery-1.9.1源码分析系列(八) 属性操作

    jQuery的属性操作主要包括 jQuery.fn.val jQuery.fn.attr jQuery.fn.removeAttr jQuery.fn.prop jQuery.fn.removePro ...

  3. 如何从线程返回信息——轮询、回调、Callable

    考虑有这样一个LiftOff类: /** * 类LiftOff.java的实现描述:显示发射之前的倒计时 * * @author wql 2016年9月21日 下午1:46:46 */ public ...

  4. 前端必须了解的布局常识:普通流(normal flow)

    目录 一.概述 二.块级元素和内联元素 常见的块级元素 BFC 常见的行内元素 IFC 三.哪些情况会脱离普通流 浮动 绝对定位 固定定位 display:none 四.总结 五.参考资料 一.概述 ...

  5. .Net语言 APP开发平台——Smobiler学习日志:快速在手机上实现n×m形式的菜单(IconMenuView)

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"S ...

  6. html 空链接 href="#"与href="javascript:void(0)"的区别

    #包含了一个位置信息 默认的锚是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#但跳动到了页首 而javascrip ...

  7. UVALive 6908---Electric Bike(DP或记录型深搜)

    题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  8. java中抽象、分装、继承和多态的理解

    1.抽象.封装装.继承和多态是java面向对象编程的几大特点. 抽象:所谓抽象就是对某件事务,我们忽略我们不关心不需要的部分,提取我们想要的属性和行为,并且以代码的形式提现出来:例如我们需要对一个学生 ...

  9. 【JAVA并发编程实战】5、构建高效且可伸缩的结果缓存

    首先创建一个借口,用来表示耗费资源的计算 package cn.xf.cp.ch05; public interface Computable<A, V> { V compute(A ar ...

  10. 魔术方法__sleep 和 __wakeup

    感觉序列化和反序列化用得倒是比较少了,而json_encode和json_decode用得相对多,都是转化成串,进行入库.传输等.json更方便,但是序列化和反序列化结合这两个魔术方法使用倒还行< ...