中间件速查手册
关系型数据库 · sqlite

SQLite

一个文件就是一个数据库,不用装服务

关系型数据库Public DomainC学习难度:入门

SQLite 不是一个服务,而是一个库:链进你的程序,数据存在一个文件里。它没有网络协议、没有账号权限、没有独立进程,所以零运维。全世界每一台手机、每一个浏览器里都有它——它可能是部署量最大的数据库。

01

它解决什么问题

为了存几百条配置或本地缓存,专门装一个 MySQL 太重:要起服务、配账号、管备份,机器一重启还得保活。

真实场景:典型场景:手机 App 的聊天记录、浏览器的书签、桌面软件的本地工程文件、小型站点的数据(每天几万访问完全够用)。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

一条 SQL 在 SQLite 里怎么执行

应用程序同一个进程SQLite 库prepare / stepPager页缓存 / 锁数据库文件app.dbWAL 文件app.db-wal

← 左右滑动查看完整流程图 →

01 / 05
1. 打开文件

程序启动时 sqlite3_open 打开 .db 文件,不需要连接服务器,也没有账号密码。

提示:没有网络、没有服务进程:调用直接发生在你的程序里,数据从页缓存读写文件。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 零运维:没有服务、没有账号、没有端口,拷文件就是备份
  • 极快:进程内调用,读操作微秒级,比走网络的数据库快一个量级
  • 部署量最大:Android、iOS、浏览器、各种桌面软件都在用
  • 公共领域授权,商用没有任何限制
  • 单文件事务完整,支持大部分 SQL-92 语法
不适合什么
  • 写是库级串行:同一时刻只能有一个写事务
  • 没有网络协议,多台机器没法共享一个库
  • 没有用户权限体系,谁拿到文件谁就能读
  • 不适合高并发写入和大数据量(几百 GB 就该换库)
05

常见使用场景

每个场景都配一句「为什么用它」。

01

移动端本地存储

App 的聊天记录、离线缓存、用户设置。

为什么用它:体积小、无需服务、断网也能用,是移动端的默认选择。

02

桌面软件与工具

IDE 的索引、笔记软件的数据库、设计工具的工程文件。

为什么用它:用户不需要装数据库,程序自带就能跑。

03

小型站点与边缘服务

日访问几万的小站、树莓派上的采集服务、CI 里的测试库。

为什么用它:读多写少、单机部署,SQLite 完全够用而且省事。

07

常见问题

上手第一个月最容易卡住的地方。

Q1SQLite 能用在生产环境吗?

能,但要看清场景。读多写少、单机、数据量几十 GB 以内,SQLite 非常可靠(它比大多数数据库的测试覆盖率都高)。不适合的是高并发写入、多机共享、需要权限隔离的场景——这时候该上 PostgreSQL 或 MySQL。

Q2为什么写入这么慢 / 报 database is locked?

SQLite 同一时刻只允许一个写事务,默认的 rollback journal 模式下写还会阻塞读。两个办法:开启 WAL 模式(读写不互斥)、把多条写操作包进一个事务(避免每次写都 fsync)。报 locked 通常是连接没关或者事务没提交。

Q3SQLite 和 MySQL 有什么本质区别?

架构不同:SQLite 是嵌入式库,MySQL 是客户端-服务端。所以 SQLite 没有网络开销、没有并发连接的概念,也没有用户权限;MySQL 能多机访问、能精细授权、能水平扩展。选型先问“是不是同一台机器上的同一个进程”。

Q4多个进程同时写会怎样?

会排队。SQLite 用文件锁保证写串行,第二个写请求要么等待(busy_timeout),要么直接返回 SQLITE_BUSY。少量进程没问题,但如果几十个进程频繁写,说明这个场景不该用 SQLite。