每次说要给一个小站用 SQLite,都会有人问"能扛住吗"。我的回答通常是:你先告诉我你有多少并发。大多数时候答案是"不到十个人"。
WAL 之后,读写不互斥
默认的 journal 模式下,写会锁住整个库。打开 WAL 之后,读写可以并行,单进程写入也能达到每秒几千次事务。
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = -32000;
这三行基本就是全部调优。第二条在断电时可能丢最后一个事务,但对博客来说完全可接受。
备份是一个 cp
这是我坚持用它的真正原因。MySQL 的备份要考虑锁、一致性、binlog 位置;SQLite 只需要:
sqlite3 app.db ".backup /root/backup-$(date +%F).db"
或者干脆停两秒服务,直接 cp。恢复也是复制回去。没有第二个步骤。
什么时候不该用它
- 需要多台机器同时写(它没有主从)
- 单表上千万行且频繁范围扫描
- 需要细粒度的权限控制
这三条之外的绝大多数场景,SQLite 都不会成为瓶颈。真正的瓶颈通常是你自己的查询写得不对。