一. 理论知识:
synchronous 获取或设置当前磁盘的同步模式,该模式用于控制SQLite写入磁盘的时机。
通过上述可以看到,sqlite3默认采用最安全也是最慢的方式来刷盘写入数据库。如果我们业务中对
数据丢失的情况不是太敏感,而更关注于性能,我们可以设置为OFF。
当设置为OFF后,写入性能可提高3倍。大约提升到 300 的 qps
二. 关于sqlite 优化MTK建议:
1.敝司对SQLite没有做任何修改,即保持Google原生。
2.SQLite默认的sync mode 为full,但是敝司有了解到有些客户(如小米 OPPO)会进行客制化,即将sync mode修改为normal,这样SQLite数据库引擎在大部分紧急时刻会暂停,但 3. normal不像FULL模式下那么频繁,从而提升了操作速度。
4. full和normal最大的区别在于full模式下于SQLite数据库引擎在紧急时刻会暂停以确定数据已经写入磁盘,而normal模式下SQLite数据库引擎只会在大部分紧急时刻会暂停,但不像FULL模式下那么频繁。因此目前Google给出的明确潜在风险是,在normal模式下有很小的几率发生电源故障导致数据库损坏的情况。
某些客户会进行客制化,将sync mode改为normal,但是敝司没有遇到过客户客制化后提相关的异常问题。贵司可以尝试将sync mode该问题normal进行压测。
三. 代码配置:
android/frameworks/base/core/res/res/values/config.xml
<!-- The database synchronization mode when using the default journal mode.
FULL is safest and preserves durability at the cost of extra fsyncs.
NORMAL also preserves durability in non-WAL modes and uses checksums to ensure
integrity although there is a small chance that an error might go unnoticed.
Choices are: FULL, NORMAL, OFF. -->
<string name="db_default_sync_mode" translatable="false">FULL</string>
四. 测试结果:
配置FULL: 配置NORMAL: 配置OFF:
从测试结果上看,产生的效果影响还是挺大的.也符合理论: OFF >NORMAL>FULL. 不同的配置, Sqlite的insert,update,delete 至少相差2倍.
五. 建议:
从理论上分析,NORMAL 风险不是很大,可以将db_default_sync_mode 配置成NORMAL.
本文转载自SQLite 优化配置-CSDN博客