SQLite 的 WAL(Write-Ahead Logging)模式是一种重要的性能优化机制:
-
WAL 模式原理
- 传统回滚日志模式:写操作直接修改数据库文件,使用回滚日志记录变更
- WAL 模式:写操作将变更写入 WAL 文件,而不是直接修改数据库文件
- 检查点(Checkpoint)时将 WAL 文件的内容合并到主数据库文件
-
WAL 模式的优势
- 提高并发性:读操作不会阻塞写操作,写操作不会阻塞读操作
- 减少磁盘 I/O:写入操作通常是顺序的,比随机写入更快
- 更好的崩溃恢复:WAL 文件包含所有未提交的变更,恢复更可靠
- 提高写入性能:多个写入可以批量提交,减少同步操作
-
启用 WAL 模式
sqlPRAGMA journal_mode = WAL; -
WAL 文件管理
- WAL 文件与数据库文件在同一目录下,后缀为
-wal和-shm -wal文件存储实际的 WAL 数据-shm文件是共享内存文件,用于协调并发访问
- WAL 文件与数据库文件在同一目录下,后缀为
-
检查点(Checkpoint)机制
- 自动检查点:当 WAL 文件达到一定大小时自动触发
- 手动检查点:使用
PRAGMA wal_checkpoint(TRUNCATE);手动触发 - 检查点将 WAL 文件中的有效变更合并到主数据库文件
-
WAL 模式的限制
- 不支持某些旧的 SQLite 版本
- 在网络文件系统上可能不可靠
- 需要额外的磁盘空间存储 WAL 文件
- 某些情况下可能导致数据库文件增长
-
适用场景
- 高并发读写场景
- 需要更好的崩溃恢复能力
- 写入密集型应用
- 移动应用和桌面应用
WAL 模式是 SQLite 推荐的默认配置,能够显著提高大多数应用场景下的性能。