具有索引的Android SQLite性能

gor*_*nwd 24 sqlite android

我的Android应用程序通过使用在用户PC上生成并传输到设备的SQLite数据库来工作.这一切都有效,但我没有预料到拥有大量数据的用户数量.在这些情况下,UI在等待获取数据时非常缓慢.

我已经尝试了一些技巧,我"确定"会加快速度,但似乎没有任何明显的效果.我的查询几乎都非常简单,通常是WHERE子句的单个"col = val"和列中的INTEGER数据.所以我对查询做不了多少.

最新的,我不是SQL专家,无论如何都是在PC上使用"CREATE INDEX"命令,认为这些索引用于加速数据库搜索.索引显着增加了数据库文件的大小,所以我很惊讶它似乎对我的应用程序的速度没有任何影响!在没有索引的情况下花费8秒钟填充的屏幕仍然需要大约8秒钟.我希望能把事情减少至少一半.

我现在想知道的是,如果Android上的SQLite实现完全使用数据库索引,或者我只是通过生成它们来浪费空间.谁能回答这个问题?

还有什么其他的东西可以尝试加快访问速度?

(对于它的价值,在绝对的基础上,用户没有什么可抱怨的.到目前为止,我的最坏情况用户的数据产生了630,000条记录(15个表),所以只有这么多可能!)

Doug Gordon GHCS Systems

gor*_*nwd 11

通过以更有效的方式查询数据库,我终于能够获得巨大的性能提升.例如,在构建信息数组时,我之前使用"WHERE _id = n"类型选择器查询了我需要的每一行的数据库.但是这样做,我发出了十几个查询,一次一个.

相反,我现在构建一个所需的ID列表,然后使用"WHERE _id IN(n1,n2,n3,...)"形式的单个查询来获取它们,并迭代返回的游标.执行此操作和其他一些结构优化,最大的数据库现在几乎与更普通的情况一样快速查看.

  • 是的,如果可能,减少查询的数量是提高性能的最有效方法之一.由于等待相对较慢的I/O所花费的大量安装时间. (2认同)

Dou*_*rie 10

如果索引适合查询,SQLite将使用索引.使用EXPLAIN

EXPLAIN QUERY PLAN ... your select statement ...
Run Code Online (Sandbox Code Playgroud)

查看SQLite正在使用的索引.查询计划基于对数据库内容的一些假设.您可以使用ANALYZE改进计划


Jul*_*ian 5

每次您要执行某种操作(数据库查找、长时间运行的计算、Web 请求等)花费超过几百毫秒时,您应该考虑将其包装在AsyncTask.

Painless Threading是一篇关于这个主题的好文章,所以我建议你仔细看看它。

本文讨论了 Android 应用程序使用的线程模型,以及应用程序如何通过生成工作线程来处理长时间运行的操作而不是在主线程中处理它们来确保最佳 UI 性能。