sqlite3 相关知识

WAL 模式 VS 回滚模式

特性 WAL 模式 回滚模式(Rollback Journal)
定义 使用写前日志来记录变更。 使用回滚日志来记录事务的所有修改。
特点 更高的并发性和性能;支持多读者和单写者。 支持安全的事务回滚,但并发性较低。
性能 写入性能更好,尤其是读多写少的场景。 写操作会造成较大的性能开销,尤其是在事务开始时。
写入流程 数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。 数据在开始事务时写入日志文件,完成后再更新主数据库。
读操作 读取主数据库时不需要排队,因此多个读者可以平行读取。 当写入时,读取者可能会被阻塞,直到写入完成。
数据完整性 数据可以在写入过程中保持完整,写入发生之前可以回退。 在异常情况下,使用回滚日志恢复数据,但会使写性能降低。
空间使用 WAL 文件会持续增大,直到执行 CHECKPOINT 操作。 日志文件会在事务完成后被删除,空间使用相对较小。
CHECKPOINT 操作 定期将 WAL 文件中的数据合并到主数据库。 不需要 CHECKPOINT 操作,事务完成后立即释放日志文件。
数据恢复 可以在 WAL 文件中恢复未提交的事务。 通过回滚日志恢复未完成的事务。
配置复杂性 需要手动控制 WAL 文件刷新和 CHECKPOINT。 相对简单,主要关注事务和日志保存。
适用场景 - 读多写少的应用 - 高并发读取的应用 - 需要快速响应的桌面应用或移动应用 - 需要确保数据回滚的场景 - 事务完整性重要的金融应用 - 低并发负载的环境

WAL 模式的优缺点:

优点

  • 高并发性 :
    • WAL 模式允许多个读操作并行执行,而不必等待写操作完成。这对读多写少的应用程序非常有利。
  • 写入性能 :
    • 由于写操作是先写入 WAL 文件而不是直接更改数据库,写操作的性能通常优于传统的日志模式,尤其是在进行大量插入时。
  • 避免写阻塞 :
    • 在 WAL 模式下,写操作不会阻塞读取操作。只有在强制检查点(checkpoint)过程中,才会进行某种程度的阻塞。
  • 崩溃恢复能力 :
    • WAL 文件在发生崩溃时可以帮助恢复未提交的事务。WAL 模式允许在发生故障后更加稳健地恢复数据库状态。
  • 逐步更新 :
    • WAL 文件支持逐步刷新到主数据库文件,这样可以避免在每次写入时立即更新主数据库,减少了大量 I/O 操作。

缺点

  • 存储空间 :
    • WAL 文件可能变得很大,尤其是在频繁写入的场景中。需要定期执行 CHECKPOINT 操作以清理 WAL 文件,从而释放存储空间。
  • 检查点管理 :
    • 有时需要手动管理 CHECKPOINT 操作来将 WAL 文件中的数据写入主数据库,这增加了管理复杂性。如果不定期进行 CHECKPOINT,可能导致 WAL 文件无限增大。
  • 写操作延迟 :
    • 初始写操作会写入 WAL 文件,在强制将数据从 WAL 刷新到主数据库之前,可能会有一定延迟。这对某些特定场景(例如实时系统)可能不利。
  • 持久性配置需求 :
    • 在某些情况下(特别是嵌入式系统),WAL 模式可能需要更多的内存和存储资源来管理 WAL 文件和进行 CHECKPOINT。
  • 旧版本支持 :
    • WAL 模式可能不被所有 SQLite 版本支持,使用时需要确保兼容性。

回滚模式优缺点

优点
  • 数据完整性 :
    • 回滚日志确保了数据的一致性和完整性,即使在事务异常中断或发生崩溃的情况下,可以通过回滚日志恢复到事务开始之前的状态。
  • 简单的故障恢复 :
    • 如果发生错误或系统崩溃,可以通过日志文件回滚未完成的事务,减少数据损失的风险。
  • 自动管理 :
    • 当事务结束时,日志文件可以自动清理,不需要手动管理(例如 CHECKPOINT 操作)。
  • 易于实现 :
    • 对于一些简单的应用,Rollback Journal 模式的设置和使用相对简单,因为它不会涉及复杂的参数配置或管理。
  • 低内存需求 :
    • 与 WAL 模式相比,Rollback Journal 模式通常对内存的需求较低,因为它的工作方式不需要持有大量的日志文件。
缺点
  • 性能开销 :
    • 在执行写操作时,Rollback Journal 模式需要创建和写入日志文件,可能会导致性能下降,特别是在频繁写入的状况下。
  • 读操作阻塞 :
    • 在执行写操作时,读操作通常会被阻塞,直到写入完成。这可能影响多用户环境下的并发性。
  • 写延迟 :
    • 对于每个事务,数据库在应用实际更改之前都必须首先写入回滚日志,这会引入额外的延迟。
  • 日志文件管理 :
    • 虽然不需要手动进行 CHECKPOINT 操作,但仍需要管理日志文件的大小和数量,特别是在大事务完成后,及时清理日志很重要。
  • 不适合高并发应用 :
    • 在高并发读写的场合,Rollback Journal 模式可能导致性能瓶颈,因为写入会严重影响读取性能。

主要数据结构的关系

sqlite 主要数据结构包括 connection, statements, B-tree 和 pager,它们之间的关系如下:

相关推荐
charlie1145141911 天前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
楼田莉子1 天前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
oioihoii1 天前
超越 std::unique_ptr:探讨自定义删除器的真正力量
c++
摩羯座-185690305941 天前
爬坑 10 年!京东店铺全量商品接口实战开发:从分页优化、SKU 关联到数据完整性闭环
linux·网络·数据库·windows·爬虫·python
Gohldg1 天前
C++算法·贪心例题讲解
c++·数学·算法·贪心算法
天若有情6731 天前
C++空值初始化利器:empty.h使用指南
开发语言·c++
远远远远子1 天前
类与对象 --1
开发语言·c++·算法
无敌最俊朗@1 天前
C/C++ 关键关键字面试指南 (const, static, volatile, explicit)
c语言·开发语言·c++·面试
编程充电站pro1 天前
SQL 面试高频:INNER JOIN vs LEFT JOIN 怎么考?
数据库·sql
这周也會开心1 天前
SQL-窗口函数做题总结
数据库·sql