描述
SQLite 是一个轻量级的关系数据库,开源,旨在直接嵌入应用程序,为数据存储和管理提供高效的解决方案,无需专用服务器。
什么是 SQLite?
SQLite 是一个用 C 语言编写的数据库库,它实现了一个完整、自我包含的无服务器 SQL 关系数据库引擎,无需配置。它将整个数据库(表、索引、数据等)存储在一个磁盘上的单个文件中,方便其可移植性并在多种系统中使用。SQLite 由 D. Richard Hipp 于 2000 年创建,广泛用于需要本地数据库的应用程序,如移动应用、嵌入式系统、网页浏览器和桌面软件。
主要特点
- 无服务器:
- 与 MySQL 或 PostgreSQL 等数据库不同,SQLite 不需要一个单独的服务器进程。库直接嵌入到应用程序中,应用程序通过函数调用访问数据库文件。这减少了开销并简化了配置。
- 自包含:
- SQLite 不依赖外部库(除了标准 C 库),并包含运行所需的所有内容。这使其非常适合资源有限的环境,如嵌入式设备。
- 单一文件:
- 整个数据库,包括数据、模式和索引,都存储在一个扩展名为 .db 或 .sqlite 的单一文件中。该文件是可移植的,可以在系统间轻松复制或移动,只要它们与 SQLite 的架构兼容。
- ACID 事务:
- SQLite 支持具有 ACID 属性(原子性、一致性、隔离性、持久性)的事务,确保在写入和读取操作中的可靠性,即使在故障(例如断电)发生时。
- 标准 SQL 支持:
- SQLite 实现了大部分 SQL 标准(SQL92,带扩展),包括支持表、索引、主键和外键、触发器、视图和子查询。然而,它存在一些限制,例如部分支持 ALTER TABLE,以及不支持 RIGHT OUTER JOIN 和 FULL OUTER JOIN。
- 动态类型:
- 与其他关系数据库不同,SQLite 使用动态类型,允许一列存储不同类型的值(例如,整数、文本或为空)。它定义了“类型亲和性”(如 INTEGER、TEXT、BLOB)来指导存储,但不施加严格的限制。
- 轻量快速:
- SQLite 非常高效,库的大小约为 700 KB。它经过优化,可在中等数据量的读取和写入操作中提供性能,性能与其他系统在低竞争场景下相当或更好。
- 公共领域许可证:
- SQLite 属于公共领域,这意味着可以在商业项目或开源项目中自由使用,无需许可证限制。
内部工作原理
- 架构:
- SQLite 作为嵌入式库运行在应用程序中,直接调用来管理数据库文件。它使用一个内部数据库引擎,包括 SQL 解析器、查询优化器和存储管理器。
- 存储基于高效的二进制文件格式,利用固定大小的磁盘页(通常为 4 KB)来组织数据和索引在 B+ 树结构中。
- 并发:
- SQLite 支持多个连接到同一个数据库,但有一些限制。它使用文件锁来管理并发,仅允许一次进行一个写操作(串行化)。读取可以并发进行,但写入会阻止其他操作。
- 从 3.7.0 版本开始,SQLite 支持 WAL(预写日志)模式,在写操作期间允许同时读取,从而提高了并发性,尽管仍限制为一次只允许一个写入。
- 可扩展性:
- SQLite 允许自定义扩展,如用 C 或其他语言定义的用户自定义函数(UDFs),并支持额外模块,如 FTS(全文搜索)以进行高级文本搜索。
优点
- 易用性: 不需要服务器配置或复杂管理,适合需要简单解决方案的开发者。
- 可移植性: 数据库文件可以轻松移动或复制,无需外部依赖。
- 低资源消耗: 消耗极少的内存和磁盘空间,非常适合资源有限的设备,如智能手机或物联网设备。
- 可靠性: 对 ACID 事务的支持确保数据的完整性,即使在故障场景中。
- 广泛采用: 被数十亿设备使用,包括浏览器(Firefox、Chrome)、移动操作系统(Android、iOS)以及应用程序如 Adobe Lightroom 和 Skype。
缺点
- 有限的并发性: 不适合高写入并发的应用程序,如拥有数千个同时用户的 Web 服务器。像 PostgreSQL 或 MySQL 这样的数据库更合适。
- 可扩展性: 尽管对高达数 TB 的数据库有效,SQLite 对大数据量或复杂分析工作负载没有优化。
- 不完整的 SQL 功能: 缺少对某些高级功能的支持,如 RIGHT OUTER JOIN、存储过程和通过 ALTER TABLE 进行复杂模式更改。
- 安全性: SQLite 没有本地访问控制(如用户和权限),因为访问由文件系统管理。
使用案例
- 移动应用: 在 Android 和 iOS 中用于存储应用数据,如消息、联系人和设置。
- 嵌入式系统: 由于其低资源消耗,常见于物联网设备、智能电视和家用电器中。
- 桌面应用: 像浏览器(用于存储历史记录和 cookie)和媒体管理器等软件使用 SQLite。
- 原型设计: 用于开发和测试应用程序,在迁移到客户端-服务器数据库之前。
- 本地数据库: 非常适合无需远程访问或高并发的独立应用程序。
结论
SQLite 是一个强大、轻便且灵活的解决方案,适用于需要本地、可靠且易于集成的数据库的应用程序。尽管不适合高并发或大量数据的场景,但其简单性、可移植性和高效性使其在从移动设备到嵌入式系统的各种案例中成为流行选择。