SQLite 够用,而且比你想的更快

SQLite 够用,而且比你想的更快

每次说要给一个小站用 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 都不会成为瓶颈。真正的瓶颈通常是你自己的查询写得不对。

收到1条评论
avatar
K 7 小时前
SQLite 的 .backup 命令比想象中快,几百兆的库也就几十毫秒。