Oh!Coder

Coding Life

SQLite体系结构

| Comments

SQLite拥有一个简洁的、模块化的体系结构,并引进了一些独特的方法进行关系型数据库管理。它由可以划分为3个子系统(编译器(Compiler)、核心(Core)、后端(Backend))的8个独立模块组成(详见下图)。这些模块将查询过程划分为几个独立的任务,就像在流水线上工作一样。在体系结构栈的顶部编译查询语句,在中部执行,在底部处理存储并与操作系统交互。

pic

下面让我们根据不同模块展开介绍。

  • 接口(Interface)

接口处于栈的顶端,由SQLite C API组成。程序、脚本语言还有与SQLite交互的库文件最终都是通过它与SQLite交互的。从表面上理解,这里是开发者、管理员等与SQLite通信的地方。

  • 编译器(Compiler)

编译过程从词法分析器(Tokenizer)和语法分析器(Parser)开始。它们协同处理文本形式的结构化查询语句(Structured Query Language, SQL),分析其语法有效性,然后转化为底层能更方便地处理的层次化数据结构。SQLite词法分析器是手动编码实现的,它的语法分析器是由SQLite特定的语法分析生成器Lemon(专门有一本书讲解此生成器)产生的。

代码生成器(Code Generator)将语法树翻译成一种SQLite专用的汇编代码,这些汇编语言由一些最终由虚拟机执行的指令组成。代码生成器的唯一工作是将语法树转换为完全由这种汇编语言编写的微程序并交给虚拟机处理。

  • 虚拟机(Virtual Machine)

架构栈的中心部分是虚拟机(Virtual Machine),也叫做虚拟数据库引擎(Virtual DataBase Engine,VDBE)。VDBE是基于寄存器的虚拟机,在字节码上工作,这使得它可以独立顶层操作系统、CPU和系统体系结构。VDBE的字节代码(称为虚拟机语言)由100多个被称为操作码(opcodes)的可能的任务构成,所有这些操作都是围绕数据库进行的。

VDBE是一个专为数据处理设计的虚拟机。它的指令集中所有的指令或者用来完成具体的数据库操作(比如打开一个表的游标、做记录、提取一列或者开始一个事务等),或者以某种方式控制栈为完成这些操作做准备。SQLite中的所有SQL语句—-从选择和更新记录到创建表、视图以及索引—-都是首先编译成虚拟机语言,形成一个独立的定义了如何完成给定的命令的指令集。

VDBE是SQLite的核心,它之前的所有模块都是用于创建VDBE程序的,它之后的所有模块都是用于执行VDBE程序的,每次执行一条指令。

  • 后端(Backend)

后端由B-tree、页缓存(page cache)以及操作系统接口组成。B-tree和pager一起作为信息代理。它们使用的数据源是数据库页,这些页是具有相同大小的数据块、就像用于运输的集装箱。页里面的”货物”是表示信息的大量位(bit),这些信息包括记录、字段和索引项等。B-tree和pager不需要知道信息的内容,它们只负责移动和排列这些页。

B-tree的职责就是排序。它维护着多个页之间错综复杂的关系,这些关系能保证快速定位并找到一切有联系的数据。B-tree将页面组织成树状结构(这也是它叫做B-tree的原因),这种组织结构很适合搜索,页面就是树的叶子。

pager(SQLite的一种数据结构)帮助B-tree管理页面,它负责传输。pager根据B-tree的请求从磁盘读取页面或者向磁盘写入页面。磁盘操作是目前计算机必须做的工作中最慢的事情之一。因此pager试图通过将频繁使用的页面缓存在内存中来加速这一操作,从而最小化与硬盘直接交互所花费的时间。pager的功能描述页包含事务管理、数据库锁以及崩溃恢复,其中许多功能是通过OS接口(OS Interface)实现的。

像文件锁一样的很多事情在不同的操作系统上实现是不同的。OS接口(OS Interface)为SQLite其他模块提供了屏蔽这些差异的抽象层。最终的结果就是其他模块看到的是一个一致的对外的系统接口。所以,pager不用担心在Windows上以一种方式锁文件,而在其他不同操作系统上(例如UNIX)上使用另一种方式。这就使得SQLite很容易移植到不同的操作系统上。

OS接口(OS Interface)的下面就是具体要存取的数据。

总体来看,SQLite分为三个子系统,里面包含了八个独立模块。

  1. 接口(Interface)
  2. 词法分析器(Tokenizer)
  3. 语法分析器(Parser)
  4. 代码生成器(Code Generator)
  5. 虚拟机(Virtual Machine)
  6. B-Tree
  7. Pager
  8. OS接口(OS Interface)

Comments