在iOS中使用SQLite PRAGMA synchronous=OFF和journal_mode=MEMORY进行更新的最坏情况行为

在iOS中使用SQLite PRAGMA synchronous=OFF和journal_mode=MEMORY进行更新的最坏情况行为,ios,database,performance,sqlite,pragma,Ios,Database,Performance,Sqlite,Pragma,通过同时使用synchronous=OFF和journal_mode=MEMORY选项,我能够将更新速度从15毫秒降低到2毫秒左右,这是一个重大的性能改进。这些更新一次只进行一次,所以许多其他优化(比如对一堆更新使用事务)都不适用 根据SQLite文档,如果发生某种类型的断电,DB在最坏的情况下可能会“损坏”。然而,可能发生的最糟糕的事情不是数据丢失,也可能是事务的一部分丢失(我猜这是一种腐败)。这两个选项中的任何一个真的可能发生任意损坏吗?若然,原因为何 我没有使用任何事务,因此事务中的部分写

通过同时使用synchronous=OFF和journal_mode=MEMORY选项,我能够将更新速度从15毫秒降低到2毫秒左右,这是一个重大的性能改进。这些更新一次只进行一次,所以许多其他优化(比如对一堆更新使用事务)都不适用

根据SQLite文档,如果发生某种类型的断电,DB在最坏的情况下可能会“损坏”。然而,可能发生的最糟糕的事情不是数据丢失,也可能是事务的一部分丢失(我猜这是一种腐败)。这两个选项中的任何一个真的可能发生任意损坏吗?若然,原因为何

我没有使用任何事务,因此事务中的部分写入数据不成问题,我可以处理偶尔丢失的数据。但是,如果“损坏”意味着数据库中的所有数据都可以以不可预测的方式随机更改,那么这将是不使用这些选项的一个强有力的理由


有人知道iOS上真正最坏的情况是什么吗?

表被组织为B树,以
rowid
作为键。 如果在SQLite更新树结构时丢失了一些写操作,则整个表可能无法读取。 (索引也可能发生同样的情况,但可以简单地删除并重新创建索引。)

数据按页面组织(通常为1KB或4KB)。如果在重新组织某些树时某些页面更新丢失,则这些页面中的所有数据(即,表中具有附近
rowid
值的一些随机行)可能会损坏


如果SQLite需要分配一个新页面,并且该页面包含看似合理的数据(例如,从同一个表中删除的数据),并且该页面的写入丢失,那么您在表中有不正确的数据,无法检测到它。

感谢您的响应。您认为这种类型的损坏适用于这两种设置还是仅适用于日志模式=内存?写入在任何情况下都可能丢失。但任意损坏(意味着不正确的键或值永远不会有效)会在任何情况下发生吗?我列出的所有影响都是由于写入丢失造成的。