数据库服务器-SQLite
2010-10-19 08:55:54 阿炯

SQLite 是Richard Hipp采用C语言实现的 SQL 数据库引擎,其特点是小型、快速、自包含、高可靠性和功能齐全,嵌入在所有手机和大多数计算机中,也捆绑在为数众多的其它应用中,是世界上使用量最大的数据库引擎。它是遵守ACID的嵌入式关系数据库管理系统,包含在一个相对小的C库中,使用公有领域协议授权。


SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world.

不像常见的客户端/服务器结构范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。所以主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中,它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。



Unlike client–server database management systems, the SQLite engine has no standalone processes with which the application program communicates. Instead, the SQLite library is linked in  and thus becomes an integral part of the application program. The library can also be called dynamically. The application program uses SQLite's functionality through simple function calls, which reduce latency in database access - function calls within a single process are more efficient than inter-process communication. SQLite stores the entire database (definitions, tables, indices, and the data itself) as a single cross-platform file on a host machine. It implements this simple design by locking the entire database file during writing.

特点
库实现了多数的SQL-92标准,包括事务,就是代表原子性、一致性、隔離性和持久性的(ACID),触发器和多数的复杂查询;不进行类型检查,可以把字符串插入到整数列中。例如某些用户发现这是使数据库更加有用的创新,特别是与无类型的脚本语言一起使用的时候。其他用户认为这是主要的缺点。

多个进程或线程可以访问同一个数据而没有问题,可以并行的满足多个读访问。只有在其他访问当前不被服务的时候才能满足写访问;否则写访问失败并带有一个错误代码(也可以在可配置的超时过期之后自动的重试)。当应用程序使用SQLite时,其并非作为一个独立进程通过某种通信协议(例如socket)与应用程序通信,而是作为应用程序的一部分,应用程序通过调用SQLite的接口直接访问数据文件。感谢类库的底层技术,它让SQLite变得非常快速、高效并且十分强大。

它提供了一个叫做sqlite的一个独立程序用来查询和管理SQLite数据库文件,同时也充当写使用SQLite库的应用的一个例子。SQLite 与客户端/服务器类型的 SQL 数据库引擎(例如 MySQL、Oracle、PostgreSQL)不同,它们解决的问题也不同。服务器端的 SQL 数据库引擎旨在实现企业级数据的共享存储,它们强调的是可扩展性、并发性、集中化和控制性。相比之下,SQLite 通常用于为个人应用程序和设备提供本地数据存储,它强调的是经济、高效、可靠、独立和简单。

SQLite implements most of the SQL-92 standard for SQL but it lacks some features. For example it has partial support for triggers, and it can't write to views. While it supports complex queries, it still has limited ALTER TABLE support, as it can't modify or delete columns.

主要特点

Zero-Configuration 无需安装和管理配置。
Serverless 无需服务器支持。
Single Database File 数据文件存储在一个单一的磁盘文件。
Stable Cross-Platform Database File 数据库文件格式跨平台,无论是大小端,或者是32bit或64bit机器都没有关系
Compact 完整特性的SQLite编译出来在500KiB左右,裁剪特性甚至可以得到低于300KiB的库(当前版本3.8.11.1)。
Manifest typing 可以声明数据库字段类型,但是字段存储的类型实际的存储类型和实际值相关,单独的一个字段可能包含不同存储类的值。
Variable-length records 可变长度记录,例如你存储一个字符到VARCHAR(100) 的列,实际需要的存储空间一个字符加一个字节的存储空间。
SQL statements compile into virtual machine code SQL语句会被编译成虚拟机代码,这种虚拟机代码直白可读,便于调试。
Public Domain 完全开源。

SQLite的局限及缺陷
SQL-92特性方面

正如前面提到的,SQLite不支持SQL-92的在很多企业数据库系统中可用的一些特性。
如:
外键约束(可解析的,但非强制)
很多ALTER
TABLE特性
一些TRIGGER相关的特性
RIGHT和FULL OUTER
JOIN
更新一个VIEW
GRANT和REVOKE

低并发操作
SQLite只支持平面事务;它没有嵌套和营救点能力。嵌套意味着在一个事务中可以有子事务的能力。营救点允许一个事务返回到前面已经到达的状态。它没有能力确保高层次事务的并发。它允许在单个的数据库文件上多个并发的读事务,但是只能有一个排他的写事务。这个局限性意味着如果有事务在读数据库文件的一部分,所有其他的事务将被禁止写该文件的任何一部分。类似的,如果有事务在写数据库文件的一部分,所有其他事务将被禁止读或者写该文件的任何一部分。

应用限制
因为它事务处理的有限并发,SQLite只擅长处理小型的事务。在很多情况下,这不是问题。每个应用迅速的完成它的数据库工作然后继续前进,因此没有一个事务会持有数据库超过多少毫秒。但是在一些应用中,特别是写入密集的,要求更多的并发的事务处理(表或者行级别的而不是数据库级别的)那么你将要为该应用使用其他不同的DBMS。SQLite并不打算成为一个企业级DBMS。其最适合于实现,维护和管理的简单性比商业数据库的无尽复杂特性更为重要的情况。

NFS问题
SQLite使用本地文件锁原语来控制事务处理的并发性。如果数据库文件驻留在网络分区上,可能会导致文件锁不能工作。很多的NFS实现被认为在它们的文件锁中是有Bug的(在Unix和Windows上)。如果文件锁不能像预计的一样工作,那么就可能会有两个或两个以上的应用程序在同时修改相同数据库的同一部分,导致了数据库的毁坏。因为这个问题的出现是因为位于下层的文件系统的实现的BUG,所以SQLite没有办法阻止它的发生。另一原因是大多数网络文件系统的连接延时,效果不是很好。在这种环境下,在数据库文件必须要跨网络访问的情况下,实现了客户端-服务器的模型的DBMS会比SQLite更有效。

数据库规模
因为它的开发人员的开发设计选择,SQLite可能不是一个做非常大型的数据库好选择。在理论上一个数据库文件文件可以有2TB(2^41)。日志子系统的内存开销和数据库大小是成比例的。对每个写事务,无论事务实际是写是读那个页,SQLite为每个数据库页维护一个内存内信息位,默认的页大小是1024字节。即使如此,对一个有超过几百万页的数据库,内存开销可能成为一个严重的瓶颈。

A standalone program called sqlite3 is provided which can be used to create a database, define tables within it, insert and change rows, run queries and manage an SQLite database file. This program is a single executable file on the host machine. It also serves as an example for writing applications that use the SQLite library.

SQLite is a popular choice for local/client SQL storage within a web browser and within a rich internet application framework; most notably the leaders in this area (Google Gears, Adobe AIR, and Firefox) embed SQLite.

SQLite full unicode support is optional.

SQLite also has bindings for a large number of programming languages, including BASIC, C, C++, Clipper, Common Lisp, C#, Curl, Delphi, Haskell, Java, Lua, newLisp, Objective-C (on Mac OS X and iPhone), OCaml, Perl, PHP, Pike, Python, REBOL, R, Ruby, Scheme, Smalltalk, Tcl and Visual Basic. There is also a COM (ActiveX) wrapper making SQLite accessible on Windows to scripted languages such as Javascript and VBScript. This adds database capabilities to HTML Applications (HTA).

SQLite has automated regression testing prior to each release. Over 2 million tests are run as part of a release's verification. Starting with the August 10, 2009 release of SQLite 3.6.17, SQLite releases have 100% branch test coverage, one of the components of code coverage.

优点

基于文件:整个数据库完全由磁盘上的一个文件构成,这使得它的可移植性非常好。

标准化:尽管它看起来像一个“简化版”的数据库实现,但是SQLite确实支持SQL。它省略了一些功能(RIGHT OUTER JOIN和FOR EACH STATEMENT),但同时也增加了一些额外的功能。

非常适合开发甚至是测试:在大多数应用程序的开发阶段,大部分开发人员可能都非常需要一个能够支持并发扩展的解决方案;SQLite 包含丰富的功能,所能提供的特性超乎开发所需,使用起来也非常简洁——只需要一个文件和一个C链接库。

缺点

没有用户管理:高级数据库都支持用户系统,例如管理连接对数据库和表的访问权限。鉴于SQLite的目的和性质(没有多客户端并发的高层设计),它并不包含这些功能。

缺少通过优化获得额外性能的空间:还是由于设计方面的原因,无法通过优化SQLite获得大量的额外性能。这个类库非常容易调整、也非常容易使用。它并不复杂,所以从技术上无法让它变得更快,因为它已经很快了。

在 SQLite 中的 SQL92 不支持的特性如下所示:

特性描述
RIGHT OUTER JOIN只实现了 LEFT OUTER JOIN。
FULL OUTER JOIN只实现了 LEFT OUTER JOIN。
ALTER TABLE支持 RENAME TABLE 和 ALTER TABLE 的 ADD COLUMN variants 命令,不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。
Trigger 支持支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。
VIEWs在 SQLite 中,视图是只读的。您不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。
GRANT 和 REVOKE可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。


适用的使用场景:

1. 嵌入式设备和物联网SQLite 不需要额外的管理或服务启动,非常适合用在手机、电视、机顶盒、游戏机、相机、手表等智能设备上。

2. 网站多数低流量网站可以使用 SQLite 作为数据库。根据官方网站的介绍,通常每天访问量少于 10 万次的网站都可以很好地运行 SQLite。其官方网站就使用其作为数据库引擎,每天处理大约 50 万 HTTP 请求,其中约 15-20% 的请求涉及数据库查询。

3. 数据分析SQLite3 命令行工具能方便地与 CSV 和 Excel 文件进行交互操作,适合分析大数据集。同时,许多语言都内置了 SQLite 支持,可以轻松编写脚本进行数据操作。

4. 缓存SQLite可以作为应用服务的缓存,减轻对中心数据库的压力。

5. 内存或者临时数据库得益于 SQLite 的简单快速,非常使用程序演示或者日常测试。

不适合的场景:

1. 需要通过网络访问数据库的情况。SQLite 是一个本地文件数据库,没有提供远程访问功能。

2. 要求高可用性和可扩展性的场合。SQLite 简单易用,但不可扩展。

3. 数据量极大时。尽管 SQLite 数据库大小的限制高达 281 TB,但所有数据都必须存储在单个磁盘上。

4. 写入操作高并发时。SQLite 在任何时刻只允许一个写入操作执行,其他写入操作需要排队。


Richard Hipp

1961年4月出生于北卡罗来纳州夏洛特市。


可以说,它是世界上装机最多的数据库,没有之一。微信的聊天记录据说就存于本地的SQLite文件数据库中。其最初版本的大小只有900KB左右。它最大的特点就是嵌入式,支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,还有ODBC接口。

所以,SQLite可以应用在非常多产品中,除了手机APP、电脑浏览器,甚至连电视机顶盒中也有它的身影。与同类数据库Mysql、PostgreSQL相比,它的运行速度也更快。如此强大的数据库,Richard Hipp是怎么设计出来的呢?

这还要追溯到20多年前,他接下国防公司通用动力的一个项目说起。当时要解决如何在导弹的小型计算机上安装数据库的问题。美国海军所使用的Informix数据库体积太大、无法安装,而且它是一个单独运行的进程,即使想方设法安装成功,运行的效率也不高,甚至还要耗费大量人力来操控。

由此,Richard想:“为什么不能直接从磁盘上读取数据呢?”

这样既能提高运行效率,也能减小数据库大小。于是他用C语言写了一个小文件,它可以被嵌入到任何程序中,并且大小只有900KB左右!假设要启动导弹上一个GPS程序,这个文件只需在其内部创建一个小数据库,就能来管理相应的数据。第一版SQLite就这样诞生了。之后Richard对SQLite进行过多次更新。2001年刚发布第二版后不久,摩托罗拉就给他打来合作的电话,希望把SQLite应用在他们的手机上。2005年他直接开源了SQLite,并于同年获得Google O’Reilly 开源奖。而他最新发布的网络服务器Althttpd,其实从2004年就开始运行SQLite官网了。从官网上介绍得知Althttpd的处理能力还可以。

截至到2024年,Althttpd在SQLite官网每天处理约50万个HTTP请求(每秒5、6个),每天能够提供200GB的内容(约18兆比特/秒)。


他学习编程的缘起,还要从中学说起。大概是在70年代左右,当时Richard在读9年级。一次偶然的经历,让他看到电传打字机,背后都连着一个大型计算机。他被震撼到了,于是下定决心说:必须要学会编程。执行力超强的他,立马就去学校图书馆,将所有关于计算机的书都借出来。实际上,只有三本。那天晚上,他就将三本书看完了,还开启了学习用BASIC编程的旅途。随后不久,Apple II出来了。不太富裕的他,只买了一个主板,然后自己搭建键盘、电源,并将它们全部焊接起来。

这当中还发生了一个小插曲。

第一个主板不能用,他就电话给苹果。联合创始人史蒂夫·沃兹尼亚克就给他寄了另一个主板。组装成功之后,他就试图在4K的内存中编写程序,这里面还包括视频内存。当时还因为没有显示器,他就调制射频,将它挂在电视机的天线上。虽然分辨率感人,整个屏幕只有40个字符宽,24行高。直到现在,他仍然表示:It was the most amazing thing in the world.

这样的创造因子,是从他父亲那里继承而来。Richard这样形容他的父亲:“他是那种最原始的制造者,比如内燃机什么的”。而Richard则将同样的想法——从零开始创造事物,放在了抽象的东西上。接触到计算机之后,他喜欢上了编程,原因很简单:不需要用任何具象的材料,就能构建一个完全不同的世界。事实上,他也一直在付诸实践。

继SQLite之后,Richard接着写了分布式版本控制系统Fossil、Bug追踪系统CVSTrac,以及解析器生成器Lemon。每次都是因为遇到了一个问题,然后就自己去编写。


站内参考:
SQLite数据类型
SQLite数据库入门
SQLite4的设计概述
SQLite中的各种限制
SQLite新特点之事务
SQLite书籍介绍之Using SQLite

Sqlite学习笔记
操作入门
SQL语法
高级用法

SQLite版本更新录(202x)


官方主页:http://www.sqlite.org/

该文章最后由 阿炯 于 2024-04-16 11:34:36 更新,目前是第 3 版。