一、 概况:

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 管理应用程序数据、快速应用程序原型制造和培训工具。

由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,它将为那些以前无法提供用作持久数据的后端的数据库的应用程序提供了高效的性能。如今没有必要使用文本文件来实现持久存储。SQLite 之类的嵌入式数据库的易于使用性可以加快应用程序的开发,并使得小型应用程序能够完全支持复杂的 SQL。这一点对于对于小型设备空间的应用程序来说尤其重要。
嵌入式数据库对于加快应用程序开发也很重要,尤其是在用于数据库抽象层(例如PEAR::DB或ezSQL)时。最后,SQLite 正在积极开发中,未来一定会有新的功能,会对开源社区更有用。

SQLite 小调研的更多相关文章

  1. SQLite 数据库调研

    SQLite数据库的特点(转载的): ★技术上的优点和特性 SQLite是一个轻量级.跨平台的关系型数据库.既然号称关系型数据库,支持SQL92标准中常用的玩意儿(比如视图.事务.触发器等)就是理所当 ...

  2. ibatis集成Sqlite:小数据库也有大作用

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 Ibatis简介: Ibatis是一个类似于Hibernate的数据库ORM(对象关系映射,通俗点就是将数据 ...

  3. sqlite小知识

    删除数据时,由于缓存关系,数据了文件大小不会一下子减小,可以通过执行vacuum;或新建表时使用自动整理大小来实现. sqlite的大小理论上可以达到140T. 暂时,使用C的api,只能使用不是.开 ...

  4. MySQL 小调研

    一. 概况: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL ...

  5. Level DB 小调研

    一. 概况: 1. 背景: 随着信息技术的高速发展,数据存储量和流量呈现爆炸式增长.目前百度统计日 PV(日点击量)已超过 75 亿次,中国网民在百度上进行50 亿次的搜索请求,百度贴吧日 PV 十亿 ...

  6. Fog of War小调研

    看起来LOL和DOTA2都用的是格子来做的战争阴影,并且是用PP做的.

  7. Redis 小调研

    一. 概况: Redis是一款开源的.网络化的.基于内存的.可进行数据持久化的Key-Value存储系统.它的数据模型建立在外层,类似于其它结构化存储系统,是通过Key映射Value的方式来建立字典以 ...

  8. Neo4j 小调研

    一. 概况: 在图计算中,基本的数据结构表达式是:G= ( V,E ),V=vertex( 节点 ),E=edge(边) .图数据库中数据模型主要以节点和关系(边)来体现,也可以处理键值对.数据具有如 ...

  9. Elastic Search 小调研

    一.概况: Elastic Search 是一个基于Apache Lucene™工具包的开源搜索引擎.无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库 ...

随机推荐

  1. Spring Enable高级应用及原理

    Enable* 之前的文章用到了一些Enable*开头的注解,比如EnableAsync.EnableScheduling.EnableAspectJAutoProxy.EnableCaching等, ...

  2. linux下又一次定位svn url方法

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/oudahe/article/details/34437661 linux下又一次定位svn url方 ...

  3. Java面试宝典(5)算法

    二.算法与编程 1.编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔. 答: pack ...

  4. 微信小程序の条件渲染

    <view> 今天吃什么 </view> <view wx:if="{{condition==1}}">饺子</view> < ...

  5. Codeforces 1169E DP

    题意:给你一个长度为n的序列,有q次询问,每次询问给出两个位置x和y(x < y),问是否可从x到达y?可达的定义是:如果存在一个序列(假设长度为k),其中p1 = x, pk = y,并且这个 ...

  6. leetcode-160周赛-5239-循环码排列

    题目描述: 参考格雷编码: class Solution: def circularPermutation(self, n: int, start: int) -> List[int]: res ...

  7. 源码方式安装 lrzsz库

    源码方式安装 lrzsz库:https://www.cnblogs.com/cocoajin/p/11731787.html 我们都知道安装了lrzsz工具的linux系统环境,在shell里可以非常 ...

  8. java中获取类加载路径和项目根路径的5种方式分析

    package my; import Java.io.File; import java.io.IOException; import java.net.URL; public class MyUrl ...

  9. 微信中location.reload失效

    var len = window.location.href.indexOf("?"); if(len>0){     window.location.href=window ...

  10. 2、Locust压力测试 实战

    创建测试脚本 创建Test()类继承TaskSet类 创建beigong() 方法表示一个行为,访问北弓官网首页.用@task() 装饰该方法为一个任务.1表示一个Locust实例被挑选执行的权重,数 ...