2

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

每个数据库只包含一个表,我只使用它阅读。

你能给我什么建议来尽可能优化数据库。我已经阅读了这篇文章,除了 PRAGMA 命令我还能使用什么?

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

4

4 回答 4

1

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

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

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

  • 设置页面大小等;
  • 创建有用的索引;
  • ANALYZE
  • VACUUM

在您的应用程序中,您可能会尝试增加页面缓存大小,但如果您的工作集大于可用内存,那无论如何也无济于事。无论如何,从闪存中随机读取的速度很快,所以这不是什么大问题。

于 2012-10-11T05:41:16.333 回答
0

巨大是相对的。但最终,设备受限于存储和内存。因此,假设巨大超出了设备的典型限制,您有几个选择。

第一种选择是将您的庞大数据集存储在云中,并且连接的设备可以通过提供云服务以及来自云端的 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 同步=OFF
  5. 压缩数据库
  6. 更换内存分配库
  7. 使用 PRAGMA count_changes=OFF
于 2012-10-11T03:24:18.887 回答
0

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

于 2013-09-09T09:18:04.357 回答
0

也许我说的是显而易见的,但您可能应该用以下SQLITE_OPEN_READONLY标志打开它sqlite3_open: 我认为 SQLite 将利用这一事实并优化引擎的行为。

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

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

于 2012-10-14T06:52:23.717 回答