深入理解android卷3_深入理解SQLite(3)体系架构

1前言

在前面的文章中,我们谈到了SQLite的常用API接口,当然如果你只是需要做简单的数据存储,上篇文章的知识点就已经足够满足了。

但是如果要想要使用更加强大的SQLite功能,还需要深入理解的SQLite的实现原理。本文,我们就来学习下SQLite架构。

2概要

SQLite的基本原理是将SQL文本编译成字节码,然后使用虚拟机运行该字节码。看下架构图(来源www.sqlite3.org):

26d09fd9f061a0039340939a8c6b4172.png

在上篇文章就讲述到 sqlite3_prepare_v2()和相关接口就实现了将SQL文本转换成字节码编译器的功能。

sqlite3_stmt对象就是被编译成单个字节码所存储的容器。

sqlite3_step()接口传递一个字节码程序到虚拟机,并运行该程序,直到它完成或者返回的查询结果的行信息,或导致了致命错误,或者是产生了中断。

3接口(Interface)

接口由 SQLite C API 组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与 SQLite 交互的(我们经常使用的 ODBC/JDBC 最后也会转化为相应 C API 的调用)。

4编译器(SQL Compiler)

编译过程从分词器(Tokenizer)和分析器(Parser)开始。它们协作处理文本形式的结构化查询(Structured Query Language, SQL)语句,分析其语法有效性,转化为底层能更方便处理的层次数据结构——语法树, 然后把语法树传给代码生成器(code generator)进行处理。

SQLite 分词器的代码是手工编写的,分析器代码是由 SQLite 定制的分析器生成器(称为 Lemon)生成的。 The Lemon parser generator is designed for high performance and takes special precautions to guard against memory leaks. 一旦 SQL 语句被分解为串值并组织到语法树中,分析器就将该树下传给代码生成器进行处理。而代码生成器根据它生成一种 SQLite 专用的汇编代码,最后由虚拟机(Virtual Machine)执行。

5虚拟机(Virtual Machine)

架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎(Virtual DataBase Engine,VDBE)。它和 Java 虚拟机相似, 解释执行字节代码。

VDBE 的字节代码(称为虚拟机语言)由 128 个操作码(opcodes)构成, 主要是进行数据库操作。 它的每一条指令或者用来完成特定的数据库操作(比如打开一个表的游标、 开始一个事务等), 或者为完成这些操作做准备。 总之, 所有的这些指令都是为了满足 SQL 命令的要求。

VDBE 的指令集能满足任何复杂 SQL 命令的要求,有的 SQLite SQL 语句——从选择和修改记录到创建表、视图和索引——都是首先编译成此种虚拟机语言,组成一个独立程序,定义如何完成给定的命令。

虚拟机部分暂时就讲到这里,之后还会开篇文章独立的讲解虚拟机部分。

6后端(backend)

后端由 B-tree、 页缓冲(page cache, pager)和操作系统接口(即系统调用)构成。B-tree和page cache共同对数据进行管理的。他们都是操作是数据库页,这些页的大小都是一样。跟文件系统中的页概念类似。页中存储的是记录,字段和索引信息。B-tree和pager 都不知道信息的具体内容,他们只负责存储这些页。

B-tree的主要功能就是索引,它维护着各个页之间的关系,为了便于快速的查找数据,页被组织存储为一个树型结构。这种树就是B+tree或B-tree,这也是他的名称的由来。这种属性结构有什么优势呢?最大的优势就是提高查找数据的速度。具体怎样提供查询效率的,这就不属于本文的关注的方向了,属于数据结构的范畴了。有兴趣的可以自行百度文章一大把。

page为B-tree服务,为他提供页。pager的主要作用就是通过OS接口在B-tree和磁盘之间传递页,磁盘IO应该是计算机最慢的操作(除了网络)了。还记得那个顺序吗?

所以为了提供速度,pager使用的方式就是被页放到内存当中当做缓冲区,从而尽量减少磁盘的操作次数,它使用了特殊的算法来预测下面需要使用那些页,从而使B-tree能够更快地工作。

7工具和测试代码(Utilities and Test Code)

工具模块中包含了各种各样的实用功能。还有一些内存分配,字符串比较,Unicode转换之类的公共模块。基本上所有能想的到的基本功能模块都能在里面找的到。

测试模块中包含了无数的回归测试语句,用来检查数据库每一个角落,这就是SQLite稳定的一个重要原因。

8总结

好了,架构部分今天就简单的讲解下,各位是不是对SQLite有了大概了认识了。下期再见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值