第十一章 SQLite 的适用边界与架构建议
11.1 SQLite 能支撑多大的应用?
很多人对 SQLite 有一个误解——觉得它只是个"玩具数据库"。实际上,SQLite 的能力常常超出你的想象。
理论上限
┌─────────────────────────────────────────────────┐
│ SQLite 的理论上限 │
│ │
│ 最大数据库大小:281 TB(2⁴⁷ 字节) │
│ 最大行数:无硬性限制(受文件大小限制) │
│ 最大列数:2000 列(编译选项可调整) │
│ 最大 SQL 语句长度:1,000,000,000 字节 │
│ 最大 ATTACH 数据库:125 个 │
│ 单表最大行数:2⁶⁴ 行(理论值) │
│ │
│ 实际上,大多数应用在数据库达到 1 GB 之前 │
│ 就已经轻松满足需求了。 │
└─────────────────────────────────────────────────┘真实案例
| 谁在用 SQLite | 怎么用的 | 规模 |
|---|---|---|
| 每部 iPhone / Android 手机 | 通讯录、短信、照片库、浏览器历史 | 全球数十亿设备 |
| Chrome / Firefox / Safari | 浏览器书签、Cookie、历史记录、LocalStorage | 数十亿用户 |
| Airbus A350 | 飞行软件数据存储 | 航空安全级别 |
| 微信 / WhatsApp | 本地聊天记录存储 | 十亿级用户 |
| Expensify | 生产环境 Web 应用 | 单库 16 GB |
| Pieter Levels(Nomad List 等) | 独立开发者的多个百万流量产品 | 月流量百万级 |
| Litestream | SQLite + 流式复制 = 生产数据库 | 中小型 Web 应用 |
SQLite 能轻松搞定的应用类型
✅ 嵌入式 / IoT 设备应用
✅ 移动端 App(iOS / Android)
✅ 桌面应用(Electron / 原生)
✅ 命令行工具和脚本
✅ 单元测试的数据库替身
✅ 数据分析 / 科研(替代 CSV 文件)
✅ 中小型网站和 API(< 10 万日活)
✅ 个人项目 / 独立开发者产品
✅ 应用配置和元数据存储
✅ 本地缓存层性能参考数据
在一台普通笔记本上(SSD,WAL 模式):
写入性能:
- 事务内批量 INSERT:~50,000~100,000 行/秒
- 单条 INSERT(自动事务):~50~100 行/秒
- 差距原因:每个自动事务都要 fsync 一次磁盘
读取性能:
- 主键查询:< 1 微秒
- 索引查询:< 10 微秒
- 全表扫描(100 万行):约 0.5~1 秒
- COUNT(*)(100 万行):约 0.1~0.3 秒
并发性能(WAL 模式):
- 读并发:无限制(多连接同时读)
- 写并发:1 个写者(其他写者排队等待)11.2 什么时候该切换到 PostgreSQL / MySQL
SQLite 不是万能的。以下是一些明确的信号,提示你该考虑迁移到客户端-服务器架构的数据库了。
该迁移的信号
🚨 明确需要迁移的场景:
1. 高并发写入
→ 多用户/多服务同时大量写入
→ SQLite 同一时间只允许一个写者
2. 多服务器部署
→ 微服务架构,多个后端实例需要共享数据库
→ SQLite 不支持网络访问
3. 数据库超过 100 GB
→ VACUUM 等维护操作变得耗时
→ 备份和恢复变得复杂
4. 需要复杂的权限管理
→ SQLite 没有用户/角色/权限系统
→ 无法限制不同用户的访问权限
5. 需要高级复制功能
→ 主从复制、读写分离
→ 跨地域数据同步SQLite vs PostgreSQL vs MySQL
| 维度 | SQLite | PostgreSQL | MySQL |
|---|---|---|---|
| 架构 | 嵌入式(无服务器) | 客户端-服务器 | 客户端-服务器 |
| 部署 | 零配置 | 需要安装配置 | 需要安装配置 |
| 并发写入 | 1 个写者 | 多个写者(MVCC) | 多个写者(InnoDB) |
| 多服务器 | ❌ 不支持 | ✅ 支持 | ✅ 支持 |
| 权限管理 | ❌ 无 | ✅ 完善 | ✅ 完善 |
| 复制 | ❌ 原生不支持 | ✅ 流复制 / 逻辑复制 | ✅ 主从复制 |
| JSON 支持 | ✅ 好 | ✅ 非常好(JSONB) | ✅ 好 |
| 全文搜索 | ✅ FTS5 | ✅ ts_vector | ✅ FULLTEXT |
| 运维成本 | ⭐ 几乎为零 | ⭐⭐⭐ 需要 DBA | ⭐⭐ 相对简单 |
| 适合规模 | 嵌入式~中型 | 中型~超大型 | 中型~大型 |
决策流程图
你的应用需要什么?
需要多服务器共享数据库?
├── 是 → PostgreSQL / MySQL
└── 否 ↓
需要高并发写入(> 100 写/秒持续)?
├── 是 → PostgreSQL / MySQL
└── 否 ↓
需要细粒度权限控制?
├── 是 → PostgreSQL / MySQL
└── 否 ↓
数据量可能超过 100 GB?
├── 是 → PostgreSQL / MySQL
└── 否 ↓
→ ✅ SQLite 完全够用!
不要过早优化,不要过度设计。黄金法则:先用 SQLite 开始。等到确实遇到瓶颈时,再考虑迁移。过早引入 PostgreSQL 只会增加不必要的复杂性。
11.3 混合架构:SQLite + 远程数据库
在现代架构中,SQLite 不一定要"单打独斗"。它可以和远程数据库配合使用,各取所长。
架构一:SQLite 作为本地缓存
┌────────────┐ ┌──────────────┐
│ 客户端 │ ←───→ │ SQLite │ ← 本地缓存 / 离线数据
│ (App) │ │ (本地) │
└──────┬─────┘ └──────────────┘
│
│ 网络
↓
┌──────────────┐
│ PostgreSQL │ ← 服务端主数据库
│ (远程) │
└──────────────┘
场景:移动 App 需要离线使用
→ API 数据缓存在本地 SQLite
→ 联网后同步到远程数据库
→ 典型应用:笔记 App、TODO、离线表单架构二:SQLite 作为边缘数据库
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 边缘节点 A │ │ 边缘节点 B │ │ 边缘节点 C │
│ (SQLite) │ │ (SQLite) │ │ (SQLite) │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
└───────────────┼───────────────┘
│ 同步
┌──────┴──────┐
│ 中心数据库 │
│ (PostgreSQL) │
└─────────────┘
场景:边缘计算、CDN 节点、多区域部署
→ 每个节点用 SQLite 处理本地请求(低延迟)
→ 定期同步到中心数据库Litestream —— SQLite 的流式复制
Litestream 是一个开源工具,可以把 SQLite 数据库实时复制到 S3 等对象存储,实现类似传统数据库的灾备能力。
bash
# 安装 Litestream
brew install litestream # macOS
# 配置复制到 S3
# litestream.yml
# dbs:
# - path: /path/to/my_app.db
# replicas:
# - url: s3://my-bucket/my_app
# 启动复制(在后台持续运行)
litestream replicate -config litestream.yml
# 从 S3 恢复
litestream restore -o /path/to/restored.db s3://my-bucket/my_appLitestream 的价值:
✅ SQLite 的简单性 + 云端备份的安全性
✅ 亚秒级复制延迟
✅ 支持 S3、GCS、Azure Blob、SFTP、本地目录
✅ 点时间恢复(Point-in-Time Recovery)
适合:个人项目、小团队应用、希望用 SQLite 做生产数据库LiteFS —— 分布式 SQLite
LiteFS(由 Fly.io 开发)让多个服务器节点可以共享同一个 SQLite 数据库:
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 节点 A │ │ 节点 B │ │ 节点 C │
│ (读写) │──→│ (只读) │ │ (只读) │
│ Primary │ │ Replica │ │ Replica │
└───────────┘ └───────────┘ └───────────┘
一个写节点 + 多个只读副本
通过 FUSE 文件系统透明复制架构选择总结
| 架构 | 适合场景 | 复杂度 |
|---|---|---|
| 纯 SQLite | 单服务器、嵌入式、桌面、移动 | ⭐ |
| SQLite + Litestream | 需要云备份和灾备 | ⭐⭐ |
| SQLite + LiteFS | 需要多节点只读副本 | ⭐⭐⭐ |
| SQLite(本地)+ PostgreSQL(远程) | 离线优先、边缘计算 | ⭐⭐⭐ |
| 纯 PostgreSQL | 高并发写入、大规模 | ⭐⭐⭐⭐ |
本章小结
| 知识点 | 要点 |
|---|---|
| SQLite 上限 | 最大 281 TB;实际大多数应用 < 1 GB 就够用 |
| 真实案例 | 全球数十亿设备在用(手机、浏览器、航空) |
| 迁移信号 | 高并发写入 / 多服务器 / > 100 GB / 权限管理 / 复制需求 |
| 三库对比 | SQLite(嵌入式简单)→ PostgreSQL(强大全面)→ MySQL(中间路线) |
| 混合架构 | SQLite 作缓存/边缘;Litestream 云备份;LiteFS 分布式只读副本 |
| 黄金法则 | 先用 SQLite 开始,瓶颈时再迁移 |
📖 完整附录请见:附录
- 附录 A:常用 SQL 语句速查表
- 附录 B:常用 PRAGMA 配置说明
- 附录 C:SQLite 内置函数参考(字符串 / 数学 / 聚合 / 日期 / 条件 / JSON / 窗口)
- 附录 D:推荐学习资源与官方文档链接
全书总结
┌─────────────────────────────────────────────────┐
│ │
│ 恭喜你完成了 SQLite 入门教程! │
│ │
│ 你已经学会了: │
│ │
│ ✅ SQLite 的设计哲学与架构 │
│ ✅ 安装与命令行操作 │
│ ✅ DDL:建库、建表、约束 │
│ ✅ DML:增删改、UPSERT │
│ ✅ SELECT:从基础到 JOIN、子查询、CTE │
│ ✅ 索引:原理、创建、EXPLAIN、避坑 │
│ ✅ 事务:ACID、WAL、并发锁机制 │
│ ✅ 特色功能:JSON、FTS5、窗口函数、STRICT │
│ ✅ 编程集成:Python、Node.js、Go、ORM │
│ ✅ 运维:备份、修复、VACUUM、性能调优 │
│ ✅ 架构:适用边界、迁移信号、混合架构 │
│ │
│ SQLite 的座右铭: │
│ "Small. Fast. Reliable. Choose any three." │
│ │
│ 现在,去用 SQLite 构建你的下一个项目吧! 🚀 │
│ │
└─────────────────────────────────────────────────┘