SQLite
一个文件就是一个数据库,不用装服务
SQLite 不是一个服务,而是一个库:链进你的程序,数据存在一个文件里。它没有网络协议、没有账号权限、没有独立进程,所以零运维。全世界每一台手机、每一个浏览器里都有它——它可能是部署量最大的数据库。
它解决什么问题
为了存几百条配置或本地缓存,专门装一个 MySQL 太重:要起服务、配账号、管备份,机器一重启还得保活。
真实场景:典型场景:手机 App 的聊天记录、浏览器的书签、桌面软件的本地工程文件、小型站点的数据(每天几万访问完全够用)。
核心概念
每个概念一句话 + 一个类比。点击卡片看更详细的解释。
单文件数据库
整个库(表、索引、视图)就是磁盘上的一个文件
类比:一个 Excel 文件,拷走就是完整备份
看概念详情B-Tree 页
文件按固定大小的页组织(默认 4KB),页组成 B-Tree
类比:一本书按页装订,目录告诉你内容在第几页
看概念详情WAL 模式
写操作先追加到 -wal 文件,读不受写阻塞
类比:先在便签上记账,之后再合并进正式账本
看概念详情类型亲和
列类型只是“建议”,值可以存成别的类型
类比:标签写着“放书”,但塞个杯子进去也不会报错
看概念详情嵌入式
没有服务进程,数据库就是程序的一部分
类比:随身带的笔记本,不用去图书馆借
看概念详情数据流转动画
跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。
一条 SQL 在 SQLite 里怎么执行
← 左右滑动查看完整流程图 →
程序启动时 sqlite3_open 打开 .db 文件,不需要连接服务器,也没有账号密码。
提示:没有网络、没有服务进程:调用直接发生在你的程序里,数据从页缓存读写文件。 悬停图中的节点可以看概念解释。
优劣势
短句说清适合什么、不适合什么,选型时先看这一栏。
- 零运维:没有服务、没有账号、没有端口,拷文件就是备份
- 极快:进程内调用,读操作微秒级,比走网络的数据库快一个量级
- 部署量最大:Android、iOS、浏览器、各种桌面软件都在用
- 公共领域授权,商用没有任何限制
- 单文件事务完整,支持大部分 SQL-92 语法
- 写是库级串行:同一时刻只能有一个写事务
- 没有网络协议,多台机器没法共享一个库
- 没有用户权限体系,谁拿到文件谁就能读
- 不适合高并发写入和大数据量(几百 GB 就该换库)
常见使用场景
每个场景都配一句「为什么用它」。
移动端本地存储
App 的聊天记录、离线缓存、用户设置。
为什么用它:体积小、无需服务、断网也能用,是移动端的默认选择。
桌面软件与工具
IDE 的索引、笔记软件的数据库、设计工具的工程文件。
为什么用它:用户不需要装数据库,程序自带就能跑。
小型站点与边缘服务
日访问几万的小站、树莓派上的采集服务、CI 里的测试库。
为什么用它:读多写少、单机部署,SQLite 完全够用而且省事。
常见问题
上手第一个月最容易卡住的地方。
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。