具有索引的Android SQLite性能

时间:2010-11-28 19:20:48

标签: android sqlite

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

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

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

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

此外,还有其他任何尝试加快访问速度的事情吗?

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

道格戈登   GHCS系统

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:10)

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

EXPLAIN QUERY PLAN ... your select statement ...

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

改进计划

答案 2 :(得分:4)

每次你要执行某种动作(数据库查找,长时间运行计算,Web请求等)花费超过几百毫秒时,你应该考虑将它包装在{{3 }}

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

  

本文讨论了线程   Android应用程序使用的模型   应用程序如何确保最佳UI   通过产生工作线程来实现性能   处理长期运营   而不是在主要处理它们   线程。