优化对只读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
(粗略有效)
- 使用内存数据库
- 使用BEGIN TRANSACTION和END TRANSACTION
- 使用索引使用PRAGMA cache_size
- 使用PRAGMA synchronous = OFF
- 压缩数据库
- 替换内存分配库
- 使用PRAGMA count_changes = OFF
也许我说的很明显,但你应该用SQLITE_OPEN_READONLY
标志打开sqlite3_open
:我认为SQLite会利用这个事实并优化引擎的行为。
请注意,所有正常的SQL(迭代)优化提示仍然适用(例如,VACUUMing来完成数据库,在数据库创建时设置正确的页面大小,正确的索引等等......)
此外,如果您有多个线程访问应用程序中的数据库,您可能还想尝试SQLITE_OPEN_NOMUTEX
和SQLITE_OPEN_SHAREDCACHE
标志(但它们需要sqlite3_open_v2)
你还需要关闭日志,因为数据不会改变http://www.sqlite.org/pragma.html#pragma_journal_mode PRAGMA journal_mode = OFF
以上是关于优化对只读sqlite数据库的快速访问?的主要内容,如果未能解决你的问题,请参考以下文章