SQLite 小调研
一、 概况:
SQLite 是 D. Richard Hipp 于 2000 年采用 C 语言编写的一个轻量级、跨平台的关系型数据库,支持大部分 SQL92 标准(比如视图、事务、触发器、blob 数据类型等),支持弱类型数据存储,开源免费,现已被嵌入最新的 PHP5 中。在 SQLite的官方网站上,也可以看到 SQLite 逐渐被许多大公司采用,比如 Adobe、Apple、Firefox、Google、Sun、Symbain 等。
它具有以下优点:
① 轻量级:SQLite 为进程内数据库引擎,嵌入运行于程序的进程空间,速度快。SQLite 全部的功能都包含在一个不到500KB 的动态链接库文件中。
② 绿色:SQLite 的核心引擎不依赖第三方的软件,编译链接进程序即可,无须“安装”。
③ 文件型数据库:SQLite 数据库中所有的信息都包含在一个文件内,类似于 Access,数据文件拷贝、备份方便。
④ 跨平台/可移植性:SQLite 除了支持主流常见的操作系统(Windows、Mac OS X、Linux),还支持很多嵌入式系统 (比如 Android、Windows Mobile、Symbin、Palm、VxWorks 等)。
⑤ 提供多种编程语言接口:SQLite 支持 C/C++、Java、Python、PHP、DOT.NET 等,提供了多种编程接口,适合混合语言编程,允许为 SQL 命令集动态添加自定义函数 (简单函数及聚集函数),而无需重新编译 SQLite 库。
至于缺点,SQLite 通过 OS 的文件锁实现库级锁,粒度很大,对并发控制、数据加密支持的不是太好,但是基于其开放源码的特性,用户可以自行加以改进。在创建索引 ( CREATE INDEX)和删除表 ( DELTE TABLE) 时明显比其他数据库慢。
SQLite 适合用于嵌入式便携设备 (如智能手机、PDA等),亦或是其他要求较低的桌面应用软件中,也可以考虑动态地嵌入到应用程序中,比如用于某些企业应用软件的本地磁盘格式文件或数据库。有经验的 SQL 用户还可以使用SQLite 命令行程序去分析各种混杂的数据集。
二、 原理简介:
SQLite 采用模块化程序设计,主要由 3 个子系统、8 个独立的模块构成,其体系结构如下图所示。
SQLite体系结构图
(1) 接口
由两部分组成: 核心 API (core API ) 和扩展 API (exten-sion API ),核心 API 的函数实现基本的数据库操作,扩展 API通过创建自定义的 SQL 函数去扩展 SQLite。
(2) 编译器
在编译器中,分词器和分析器对 SQL 语句进行语法检查,然后把它转化为底层能更方便处理的分层的数据结构- --语法树,然后把语法树传给代码生成器 (code generator ) 进行处理。而代码生成器根据它生成一种针对 SQLite 的汇编代码,最后由虚拟机执行。
(3) 虚拟机
架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎 VDBE,它和 Java 虚拟机相似,解释执行字节代码。VDBE的字节代码由 128 个操作码 (opcodes ) 构成,它们主要集中在数据库操作。它的每一条指令都用来完成特定的数据库操作 (比如打开一个表的游标) 或者为这些操作栈空间的准备(比如压入参数)。
(4) 后端
后端由 B-树,页缓存和操作系统接口 (即系统调用) 构成。B-tree 的主要功能就是索引,它维护着各个页面之间的复杂的关系,便于快速找到所需数据;pager 的主要作用就是通过 OS 接口在 B-tree 和 Disk 之间传递页面。
总而言之,SQLite作为一个轻量级的传统关系型数据库,具有内存开销小、速度快(甚至快于MySQL)、对嵌入式有很好的支持、兼容性强等优势。当前的SQLite已更新至SQLite3版本,兼容性和灵活性日益增强。一些能够真正表现 SQLite 优越性能的领域是 Web 站点,可以使用 SQLite 管理应用程序数据、快速应用程序原型制造和培训工具。