我有一个庞大的数据库,我希望我的应用程序能够尽快使用它。我正在使用android,因此资源受到更多限制。我知道在 sqlite 数据库中存储大量数据不是一个好主意,但我需要这个。
每个数据库只包含一个表,我只使用它阅读。
你能给我什么建议来尽可能优化数据库。我已经阅读了这篇文章,除了 PRAGMA 命令我还能使用什么?
也许有一些特殊类型的表被限制为只读查询,但主要是比普通表类型更快?
我有一个庞大的数据库,我希望我的应用程序能够尽快使用它。我正在使用android,因此资源受到更多限制。我知道在 sqlite 数据库中存储大量数据不是一个好主意,但我需要这个。
每个数据库只包含一个表,我只使用它阅读。
你能给我什么建议来尽可能优化数据库。我已经阅读了这篇文章,除了 PRAGMA 命令我还能使用什么?
也许有一些特殊类型的表被限制为只读查询,但主要是比普通表类型更快?
巨大是相对的。但最终,设备受限于存储和内存。因此,假设巨大超出了设备的典型限制,您有几个选择。
第一种选择是将您的庞大数据集存储在云中,并且连接的设备可以通过提供云服务以及来自云端的 RESTful API 之类的东西来向设备提供数据,从而提供对该数据的视图。如果设备和应用程序依赖于始终保持连接,那么除非您想要缓存数据,否则您不需要太多的本地存储空间。
另一种方法是偶尔连接的设备(有时离线),您可以在其中提取最相关的数据片段以在设备上工作。在该模型中,您可以离线工作并推/拉回云端。在这个模型中,sqlite 是保存相关数据片的存储机制。
根据评论编辑:
关于优化设备上的内容,请参阅此处的优化常见问题解答:
http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html
(按有效性的粗略顺序)
你还需要关闭日志,因为数据不会改变http://www.sqlite.org/pragma.html#pragma_journal_mode PRAGMA journal_mode=OFF
也许我说的是显而易见的,但您可能应该用以下SQLITE_OPEN_READONLY
标志打开它sqlite3_open
: 我认为 SQLite 将利用这一事实并优化引擎的行为。
请注意,所有正常的 SQL(ite) 优化技巧仍然适用(例如 VACUUMing 以完成数据库,在创建数据库时设置正确的页面大小,正确的索引等等......)
此外,如果您有多个线程访问应用程序中的数据库,您可能还想尝试一下SQLITE_OPEN_NOMUTEX
andSQLITE_OPEN_SHAREDCACHE
标志(尽管它们需要 sqlite3_open_v2)