2

我正在尝试从在 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%。

还有其他可以帮助提高性能的东西吗?我担心的一件事是,即使它是只读访问,我也有多个线程可以从数据库中读取数据,在多线程场景中使用上面的编译指示是否安全?

4

1 回答 1

1

确保所有重要查询都有适当的索引。

创建数据库后,您应该VACUUM创建它。

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

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

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

于 2013-04-30T06:57:28.277 回答