优化对只读sqlite数据库的快速访问?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优化对只读sqlite数据库的快速访问?相关的知识,希望对你有一定的参考价值。

我有一个庞大的数据库,我希望我的应用程序尽快使用它。我正在使用android,所以资源更受限制。我知道在sqlite数据库中存储大量数据不是一个好主意,但我需要这个。

每个数据库只包含一个表,我只使用READ。

您可以给我什么建议来尽可能地优化数据库。我已经阅读了this帖子,除了PRAGMA命令我还能使用什么?

也许有一些特殊类型的表被限制为只读查询,但主要比普通表类型更快?

答案

只要您的数据库适合设备,就没有问题;你只需要更少的空间用于其他应用。

没有特殊的表格类型。但是,如果您的查询仅使用表的列的子集,并且剩余足够的空间,请考虑添加一个或多个covering indexes

只读是允许在部署数据库之前在桌面上优化数据库:

在您的应用程序中,您可能会尝试增加page cache size,但如果您的工作集大于可用内存,那么无论如何都无济于事。在任何情况下,从闪存中随机读取都很快,因此这不是什么大问题。

另一答案

巨大的是相对的。但最终设备受到存储和内存的限制。因此,假设巨大超出设备的典型约束,您可以选择一些选项。

第一种选择是将您庞大的数据集存储在云中,并且连接的设备可以通过提供云服务来提供对该数据的视图,其中包括来自coud的RESTful API,以将数据提供给设备。如果设备和应用依赖于始终连接,则除非要缓存数据,否则不需要那么多本地存储。

另一种方法是偶尔连接的设备(有时是离线的),您可以从中获取最相关的数据片段以处理设备。在该模型中,您可以脱机工作并推/拉回云。在这个模型中,sqlite是保存那片相关数据的存储机制。

根据评论编辑:

关于优化设备上的内容,请参阅此处的优化常见问题解答:

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

(粗略有效)

  1. 使用内存数据库
  2. 使用BEGIN TRANSACTION和END TRANSACTION
  3. 使用索引使用PRAGMA cache_size
  4. 使用PRAGMA synchronous = OFF
  5. 压缩数据库
  6. 替换内存分配库
  7. 使用PRAGMA count_changes = OFF
另一答案

也许我说的很明显,但你应该用SQLITE_OPEN_READONLY标志打开sqlite3_open:我认为SQLite会利用这个事实并优化引擎的行为。

请注意,所有正常的SQL(迭代)优化提示仍然适用(例如,VACUUMing来完成数据库,在数据库创建时设置正确的页面大小,正确的索引等等......)

此外,如果您有多个线程访问应用程序中的数据库,您可能还想尝试SQLITE_OPEN_NOMUTEXSQLITE_OPEN_SHAREDCACHE标志(但它们需要sqlite3_open_v2)

另一答案

你还需要关闭日志,因为数据不会改变http://www.sqlite.org/pragma.html#pragma_journal_mode PRAGMA journal_mode = OFF

以上是关于优化对只读sqlite数据库的快速访问?的主要内容,如果未能解决你的问题,请参考以下文章

使用片段从数据库 SQLite 获取数据时出错

应用程序包中的只读 SQLite 数据库

Android数据库代码优化 - 从SQLite说起

读取缓冲区拥有的访问内存

如何将 SQLite 数据库与片段结合起来?

如何提高sqlite3的访问效率