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数据库 |
| 数据备份 | 不能简单地只复制主数据库文件,否则可能遗漏尚未合并的已提交数据 |