SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库(轻型数据库)。
由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android、iPhone都有内置的SQLite数据库供开发人员使用,它的易用性可以加快应用程序的开发,并使得复杂的数据存储变得轻松了许多。SQLite第一个Alpha版本诞生于2000年5月
SQLite的特点(SQLite’s Features and Philosophy)
零配置(Zero Configuration)
可移植(Portability):
Compactness:
SQLite是被设计成轻量级,自包含的。
简单(Simplicity)
灵活(Flexibility)
可靠(Reliability):
SQLite的核心大约有3万行标准C代码,这些代码都是模块化的,很容易阅读。
架构(architecture)
SQLite采用了模块的设计,它由三个子系统,包括8个独立的模块构成。
上图是各模块的出现次序
Tokenizer(词法分析器),Parser(语法分析器),Code Generator(代码生成器),Virtual Machine(虚拟机),B-Tree(B-树),Pager(页面缓存),OS Interface(os接口)
前三个模块是用于SQL语句或代码解析,后四个模块主要用于执行。
为了解析SQL,一定有词法+语法分析+语义分析;为了能执行SQL语句,一定需要先生成执行计划,并通过优化器选择最优的执行计划;为了实现事务的ACID特性,一定有事务管理模块,并发控制模块和故障恢复模块等。
各个模块功能
Tokenizer:将SQL语句进行分词
Parser:将词法分析器的输出作为它的输入,结合语义(利用元数据判断,比如表是否存在),生成一个语法树,并最终转换化为执行计划树,这个过程中包含了通过优化器选择最佳路径。所以说整个词法分析+语法分析+语义分析+代价优化都在Parser这个模块中实现。
Code generator:将执行计划树生成虚拟机指令集,这个是sqlite比较独特的地方,主要为虚拟机做准备。
Virtual machine:通过执行代码生成器产生的指令集,来执行SQL语句满足用户的需求。通过操作数据库文件中的记录,来查询或修改数据。
B-Tree:将用户的记录通过B树结构来管理,每个用户表通过一个B+树管理,每个索引通过一个B树管理。VM通过tree模块实现从Btree中查询、插入、删除、更新记录,或者创建/删除一个Btree等。所有这些操作接口都由tree模块封装。VM执行指令时,直接调用接口即可
Pager:在tree模块看来,所有的B树的节点都是在内存中的,tree模块不直接与数据库文件打交道。Pager模块负责直接与数据库文件交互,它管理缓存,并负责内外存交互。同时它还负责并发控制和故障恢复。所以pager模块是sqlite中核心模块之一,事务的ACID特性全部靠pager模块实现
OS Interface:针对不同的操作系统,提供统一的操作文件接口。Pager模块并不关心底层的硬件和操作系统,在它看来,只需要调用统一的接口就能达到读写文件的目的。当然不仅限于此,除了文件IO,mutex,sleep,随机数生成的统一接口也是该模块封装的。
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).
SQLite优缺点
缺点:
并发访问的锁机制:SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会被写操作独占,从而导致其它读写操作阻塞或出错。
SQL标准支持不全:如:不支持外键约束
网络文件系统(NFS):有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这时候你就要小心了。当SQLite文件放置于NFS时,在并发读写的情况下可能会出问题(比如数据损坏)。原因据说是由于某些NFS的文件锁实现上有Bug。
不支持多并发应用:多个线程可以同时读,但是同时只能有一个线程写----参考SQLite多线程读写实践及常见问题总结【半月谈投稿】 ...
参考资料:
SQLite学习笔记(八)&&sqlite实现架构
SQLite的架构(The Architecture Of SQLite)
SQLite(轻量级最佳数据库) 原理分析和开发应用
Android中SQLite应用详解
android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)