SQLite开启WAL预写日志

SQLite中的WAL是指Write-Ahead Logging(预写日志),是一种数据库事务日志模式。它可以提高并发读写性能,减少读写之间的阻塞。


1. WAL的工作原理

SQLite默认使用DELETE日志模式,也可以切换到WAL模式。

启用WAL后,SQLite通常会产生以下文件:

文件 作用
database.db 主数据库文件
database.db-wal 存储尚未合并到主数据库的页面变更
database.db-shm WAL索引共享内存文件,用于协调连接访问

注意:-wal和-shm文件可能在数据库关闭或检查点完成后消失,也可能在运行期间持续存在。

2. 如何启用WAL

PRAGMA journal_mode=WAL;

3. WAL的主要优缺点

特性 说明
读写并发 读操作通常不会阻塞写操作,写操作通常也不会阻塞读操作
写入性能 通常较好,尤其适用于频繁提交的小事务
写入并发 同一时刻仍然只能有一个写事务
文件数量 可能额外产生-wal和-shm文件
网络文件系统 不适合多个主机直接通过网络文件系统共享同一个WAL数据库
数据备份 不能简单地只复制主数据库文件,否则可能遗漏尚未合并的已提交数据