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

4
我有一个巨大的数据库,希望我的应用程序尽快与之配合使用。我正在使用安卓系统,因此资源更加受限。我知道在SQLite数据库中存储大量数据不是一个好主意,但我需要这样做。
每个数据库只包含一个表格,我仅使用它进行“只读”操作。
您能给我提供最大限度地优化数据库的建议吗?我已经阅读了this帖子,除了PRAGMA命令之外,还有什么其他方法可以使用?
也许有一些特殊的表格类型专为只读查询而设计,但基本上比普通表格类型更快速?

当你说“在SQLite数据库中存储大量数据不是一个好主意”时,你指的是什么?这是Android特定的限制吗?SQLite可以处理相当大的数据库:https://dev59.com/4nRA5IYBdhLWcg3w6SRH。 - StayOnTarget
4个回答

1
只要你的数据库适合设备,那就没有问题;你只需要为其他应用程序留出更少的空间。
没有特殊的表类型。但是,如果您有仅使用表的子集的查询,并且如果剩余足够的空间,请考虑添加一个或多个覆盖索引
只读允许在部署之前在桌面上优化数据库:
  • 设置页面大小等;
  • 创建有用的索引;
  • ANALYZE
  • VACUUM
在您的应用程序中,您可以尝试增加页面缓存大小,但如果您的工作集大于可用内存,那么这也不会有所帮助。无论如何,从闪存进行随机读取很快,因此这不会成为问题。

1

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

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

此外,如果你的应用程序中有多个线程访问数据库,你可能还想尝试 SQLITE_OPEN_NOMUTEXSQLITE_OPEN_SHAREDCACHE 标志(尽管需要使用 sqlite3_open_v2 函数)。


0

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 synchronous=OFF
  5. 压缩数据库
  6. 替换内存分配库
  7. 使用 PRAGMA count_changes=OFF

云不可接受。第一个原因是应用程序应该在有或没有互联网连接的情况下都能工作。第二个原因是应用程序需要实时处理大量数据,这会拖慢进度。我其实不担心数据库的存储,我担心查询速度。 - pleerock
谢谢您的回复。我不担心设备上数据库的大小,大小不是问题。我担心查询时间。我希望尽快将结果呈现给用户,因此我正在寻找可以在查询时间方面有所帮助的技巧。 - pleerock
1
链接已经失效,但我在waybackmachine上找到了它:http://web.archive.org/web/20150506145844/http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html - Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接