我的Android应用程序通过使用在用户PC上生成并传输到设备的SQLite数据库来工作。这一切都有效,但我没有预料到拥有大量数据的用户数量。在这些情况下,UI在等待获取数据时非常缓慢。
我已经尝试过一些技巧,我“肯定”会加快速度,但似乎没有任何明显的效果。我的查询几乎都非常简单,通常是WHERE子句的单个“col = val”和列中的INTEGER数据。所以我对查询做不了多少。
最新的,我不是SQL专家,无论如何都是在PC上使用“CREATE INDEX”命令,认为这些索引用于加速数据库搜索。索引显着增加了数据库文件的大小,所以我很惊讶它似乎对我的应用程序的速度没有任何影响!在没有索引的情况下花费8秒钟填充的屏幕仍然需要大约8秒钟。我希望能把事情减少至少一半。
我现在想知道的是,如果Android上的SQLite实现完全使用数据库索引,或者我只是通过生成它们来浪费空间。任何人都可以回答这个问题吗?
此外,还有其他任何尝试加快访问速度的事情吗?
(对于它的价值,在绝对的基础上,用户没有什么可抱怨的。到目前为止我的最坏情况用户的数据产生了630,000条记录(15个表),所以只有这么多可能!)
道格戈登 GHCS系统答案 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 通过产生工作线程来实现性能 处理长期运营 而不是在主要处理它们 线程。