第1章 SQLite是什么:轻量级嵌入式关系数据库

1.1 概念解释

SQLite 是目前全球部署最广泛的关系数据库引擎——它不是一个独立的服务器进程,而是直接嵌入到应用程序内部,通过函数调用完成所有数据操作。其核心特征可概括为:

  • 轻量级嵌入式:库体积约为 600 KB(编译后),无外部依赖,可直接链接到应用中。
  • 零配置:创建数据库只需指定一个文件路径,无需安装、配置用户名/密码或管理服务。
  • 服务端无需独立进程:数据库引擎在应用进程内运行,不产生额外的守护进程。
  • 以文件形式存储:整个数据库(表、索引、视图等)保存在一个单一的磁盘文件(.db 或 .sqlite)中。
  • 支持标准SQL子集:实现大部分 SQL-92 标准,包括事务(ACID)、子查询、触发器和视图,但部分高级特性(如 RIGHT JOIN、FULL OUTER JOIN)不支持。
一句话定义:SQLite 是一个 进程内、零配置、单文件 的 C 语言关系数据库库。
典型命令行体验:
# 创建/打开数据库并查看版本
sqlite3 example.db
sqlite> SELECT sqlite_version();
执行后无需启动守护进程,数据库文件立即就绪。

1.2 原理图解:SQLite 体系结构

SQLite 体系结构 应用程序进程 SQLite 核心引擎 SQL 编译器 VDBE B-Tree Pager / Cache OS 接口层 单一 .db 文件 整个数据库仅一个文件 SQL 编译器 → VDBE(虚拟数据库引擎)→ B-Tree → Pager → OS 接口 应用程序通过 C API 直接调用,无网络层、无独立进程

1.3 对比分析:SQLite vs 传统 C/S 数据库

对比维度 SQLite MySQL / PostgreSQL
部署方式 嵌入式,链接到应用 独立服务器进程,需单独安装
配置量 零配置,无需管理 需配置端口、用户、权限、缓冲池等
进程模型 在应用进程内运行 独立守护进程,多个连接对应多个线程/进程
存储方式 单一文件 数据目录(多个文件)
并发写入 一次仅允许一个写入事务 可同时处理多个写入连接
SQL支持度 核心 SQL-92 子集 更完整,支持存储过程、窗口函数等
适用规模 MB 级 ~ 几百 GB(单机) TB 级,可横向扩展

1.4 常见误区

  • 误区1:SQLite是内存数据库 ─ 虽然支持 :memory: 模式,但默认是持久化到磁盘文件的,重启后数据仍在。
  • 误区2:不支持事务 ─ 实际上 SQLite 完全支持 ACID 事务,但部分模式下并发粒度较粗。
  • 误区3:只能单用户访问 ─ 允许多个进程同时读取同一个数据库文件;写入时确实互斥,但读并发无限制。
  • 误区4:不能用于生产环境 ─ 许多嵌入式设备、移动应用、浏览器甚至航空电子设备都使用 SQLite。

1.5 应用边界

适合场景:

  • 移动端应用(Android/iOS 本地存储)
  • 桌面软件(浏览器、IDE、游戏存档)
  • 物联网/嵌入式设备(低资源环境)
  • 小型 Web 站点的后台(低并发、单机)
  • 测试与原型开发(无需安装数据库服务)

不适合场景:

  • 高并发写入(每秒数千次写入请求)
  • 多用户分布式访问
  • 需要细粒度权限控制(如按表、行级授权)
  • 超大数据集(TB 级)且需要在线扩展

1.6 练习题与实用清单

练习题(选择/判断)

  1. SQLite 是否必须安装独立的数据库服务进程?
    A. 是  B. 否
  2. 下面哪个不是 SQLite 的特性?
    A. 零配置  B. 支持存储过程  C. 单文件存储  D. 嵌入式
  3. 判断题:SQLite 在写操作时只能有一个写入者。(对 / 错)

实用检查清单(部署前自检)

  • □ 确认数据库文件路径具有读写权限
  • □ 编译时链接 libsqlite3 或动态加载
  • □ 检查 WAL 模式是否开启(提升并发读性能)
  • □ 确认磁盘空间足够(数据库最终大小约为数据量的 1.1~1.2 倍)
  • □ 避免通过 NFS/Samba 等网络文件系统直接跨机器共享 .db 文件