SQLite在多线程环境中的只读优化

时间:2013-04-30 01:49:28

标签: ios sqlite

我正在尝试从iOS设备上以只读模式使用的SQLite DB获得最大性能。到目前为止,我发现这些东西对性能有积极的影响:

sqlite3_exec(ret, "BEGIN TRANSACTION", NULL, NULL, NULL); // open transaction after open DB and close transaction before close DB
sqlite3_exec(ret, "PRAGMA journal_mode = OFF", NULL, NULL, NULL);
sqlite3_exec(ret, "PRAGMA cache_size = 20000;", NULL, NULL, NULL);
sqlite3_exec(ret, "PRAGMA locking_mode = EXCLUSIVE", NULL, NULL, NULL);

与没有上述编译指示的原始版本相比,我的性能提升了20-25%。

还有其他可以帮助提高性能的东西吗?我关注的一件事是,即使是只读访问我有多个线程可以从DB读取数据,上面的多线程场景使用pragma是否安全?

1 个答案:

答案 0 :(得分:1)

确保您拥有适用于所有重要查询的正确索引。

创建数据库后,您应VACUUM

只有在配置了可能影响交易的参数后,才应启动交易。

从同一个数据库读取的多个线程工作得很好。 (但是使用独占锁定,如果有任何线程试图写入,你将遇到问题。)

如果您的查询仅读取表格列的一部分,则可以通过为这些列创建covering index来加快速度。这允许SQLite避免读取不需要的列的值。 但是,如果有任何其他查询读取其他列,则覆盖索引和原始表都必须读入缓存,这将降低整体性能。