SQLite入门与分析(一)---简介

 写在前面:出于项目的需要,最近打算对SQLite的内核进行一个完整的剖析,在此希望和对SQLite有兴趣的一起交流。我知道,这是一个漫长的过程,就像曾经去读Linux内核一样,这个过程也将是辛苦的,但我相信结果一定是美好的... ...接下来是第一章。

1、SQLite介绍

自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性。随着软件应用程序逐渐模块模块化,一种新型数据库会比大型复杂的传统数据库管理系统更适应。嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少。
SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。
SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。

嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。

 

2、架构(architecture)

SQLite采用了模块的设计,它由三个子系统,包括8个独立的模块构成。
 
2.1、接口(Interface)
接口由SQLite C API组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与SQLite交互的(我们通常用得较多的ODBC/JDBC最后也会转化为相应C API的调用)。

2.2、编译器(Compiler)
在编译器中,分词器(Tokenizer)和分析器(Parser)对SQL进行语法检查,然后把它转化为底层能更方便处理的分层的数据结构---语法树,然后把语法树传给代码生成器(code generator)进行处理。而代码生成器根据它生成一种针对SQLite的汇编代码,最后由虚拟机(Virtual Machine)执行。

2.3、虚拟机(Virtual Machine)
架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎(Virtual Database Engine,VDBE)。它和Java虚拟机相似,解释执行字节代码。VDBE的字节代码由128个操作码(opcodes)构成,它们主要集中在数据库操作。它的每一条指令都用来完成特定的数据库操作(比如打开一个表的游标)或者为这些操作栈空间的准备(比如压入参数)。总之,所有的这些指令都是为了满足SQL命令的要求(关于VM,后面会做详细介绍)。
 
2.4、后端(Back-End)
后端由B-树(B-tree),页缓存(page cache,pager)和操作系统接口(即系统调用)构成。B-tree和page cache共同对数据进行管理。B-tree的主要功能就是索引,它维护着各个页面之间的复杂的关系,便于快速找到所需数据。而pager的主要作用就是通过OS接口在B-tree和Disk之间传递页面。

3、SQLite的特点(SQLite’s Features and Philosophy)
3.1、零配置(Zero Configuration)
3.2、可移植(Portability):
它是运行在Windows,Linux,BSD,Mac OS X和一些商用Unix系统,比如Sun的Solaris,IBM的AIX,同样,它也可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,Palm OS, Symbin和Windows CE。
3.3、Compactness:
SQLite是被设计成轻量级,自包含的。one header file, one library, and you’re relational, no external database server required
3.4、简单(Simplicity)
3.5、灵活(Flexibility)
3.6、可靠(Reliability):
SQLite的核心大约有3万行标准C代码,这些代码都是模块化的,很容易阅读。

主要参考:The Definitive Guide to SQLite

 

posted @ 2009-02-12 21:27 MrDB 阅读(25683) 评论(29) 编辑 收藏

 回复 引用 查看   
#1楼 2009-02-12 23:20 5207      
期待下文,看看能不能在WinCE下方便的应用!望楼主关注一下
 回复 引用 查看   
#2楼 2009-02-13 01:37 梁逸晨      
这是代替ACCESS的完美方案
 回复 引用 查看   
#3楼 2009-02-13 08:51 巫云      
俺就喜欢看有深度的文章,大哥加油!
 回复 引用   
#4楼 2009-02-13 09:01 vb1980[未注册用户]
喜欢看,继续。
通过log4net把运行日志写入到sqlite中,虽然数据很多了,但是查询速度还是很快。

 回复 引用   
#5楼 2009-02-13 09:07 Rexzhou[未注册用户]
现在代码接近10万行了
 回复 引用 查看   
#6楼 2009-02-13 09:22 冰绿茶      
不错,期待下文~
 回复 引用 查看   
#7楼 2009-02-13 09:29 Kevin-moon      
@梁逸晨
这是代替ACCESS的完美方案
-----------------------------------
不一定吧,楼主有没有做过SQLite的性能分析
我拿Access和Firebird做过 Access全面胜出
不过如果数据量大的话(大于2G) 就别用Access了

 回复 引用   
#8楼 2009-02-13 10:25 chanzuo[未注册用户]
期待你的虚拟机部分
 回复 引用 查看   
#9楼 2009-02-13 11:14 代码勤杂工      
如果用来做web系统的数据库,会不会有并发问题?
 回复 引用 查看   
#10楼 2009-02-13 13:00 Poplar.Young      
期待你的后续文章
 回复 引用 查看   
#11楼 2009-02-13 13:57 aierong      
Adobe AIR中自带sqlite
我最近也在学习

http://www.cnblogs.com/aierong/archive/2009/01/22/flex_Sqlite_1.html

 回复 引用 查看   
#12楼 2009-02-13 17:13 魔尊年少时      
和BerkeleyDB的比较?
 回复 引用 查看   
#13楼 2009-02-13 18:08 玉开      
我的博客中有5篇sqlite相关的随笔,请参考
http://www.cnblogs.com/yukaizhao/tag/sqlite/

 回复 引用 查看   
#14楼 2009-02-13 18:09 玉开      
--引用--------------------------------------------------
魔尊年少时: 和BerkeleyDB的比较?
--------------------------------------------------------
BerkeleyDB是键值对型的,没有sql语句;而sqlite更像关系型数据库,而且支持大多数sql语句,语法上和mysql更像一些,有limit,有last_insert_rowid()

 回复 引用 查看   
#15楼 2009-02-13 22:20 CoderZh      
SQLite确实不错!Python2.5以后都已经自带了SQLite,使用起来非常方便,效率也不错。
 回复 引用 查看   
#16楼[楼主] 2009-02-13 22:57 arrowcat      
@代码勤杂工
Concurrency. SQLite has coarse-grained locking, which allows multiple readers but
only one writer at a time. Writers exclusively lock the database during writes and no one
else has access during that time. SQLite does take steps to minimize the amount of time
in which exclusive locks are held. Generally, locks in SQLite are kept for only a few milli
seconds. But as a general rule of thumb, if your application has high write concurrency
(many connections competing to write to the same database) and it is time critical, you
probably need another database. It is really a matter of testing your application to know
what kind of performance you can get. I have seen SQLite handle over 500 transactions
per second for 100 concurrent connections in simple web applications. But even the
notion of a transaction is vague. Transactions are a function of the number of records
being modified, as well as the number and complexity of the queries involved. Acceptable
concurrency all depends on your particular application, and can only be determined
empirically by direct testing. In general, this is true with any database: you don’t know
what kind of performance your application will get until you do real-world tests.

 回复 引用 查看   
#17楼 2009-02-16 09:45 aierong      
您好,请教一个问题
我想在sqlite中,写一个这样的sql语句怎么写?
就是某个查询不存在时,往表里面插入数据

下面是我在sql2000中的写法:
IF NOT EXISTS (SELECT * FROM mydata WHERE data='abc' )
BEGIN
INSERT INTO mydata(Data) SELECT '1'
END

或者是:

SELECT * FROM mydata WHERE data='abc'
IF (@@ROWCOUNT=0)
BEGIN
INSERT INTO mydata(Data) SELECT '1'
END

您看看sqlite中有没有类似这样的sql语句?

 回复 引用 查看   
#18楼[楼主] 2009-02-16 19:09 arrowcat      
@aierong
我不知道SQLite目前是否支持这样的语法,你可以试一下,或者查一下相关文档.

 回复 引用 查看   
#19楼 2009-03-19 23:25 bottomline      
学习了.看你的SQLite系列文章.
 回复 引用   
#20楼 2009-05-30 22:21 Grove.Chu
桌面数据库还是不错的。
 回复 引用 查看   
#21楼 2009-09-18 12:09 just_go_for_it      
支持!!!!!!!
 回复 引用 查看   
#22楼[楼主] 2009-09-18 20:00 arrowcat      
@just_go_for_it
thanks

 回复 引用 查看   
#23楼 2009-09-28 10:52 牛腩      
我买的空间只支持ACCESS的。。。不知道这个SQLLITE能不能放到空间上用啊。。。
 回复 引用 查看   
#24楼[楼主] 2009-09-29 18:43 arrowcat      
@牛腩
我想只要允许上传dll文件,就应该可以用吧。

 回复 引用 查看   
#25楼 2010-01-30 10:32 september      
谢谢,很好的文章。第一次接触SQLLite,不知道支不支持存储过程?
 回复 引用 查看   
#26楼[楼主] 2010-01-30 10:43 arrowcat      
@september
目前,似乎还不支持吧。
具体的可以见
http://www.sqlite.org/lang.html

 回复 引用 查看   
#27楼 2011-04-01 10:34 helong      
看了,就留下脚印,写的不错
 回复 引用 查看   
#28楼 2011-12-05 20:45 五子棋      
不知道SQLite跟Access比,哪个速度更快一些。
 回复 引用 查看   
#29楼 2012-01-01 22:20 tunpishuang      
good.