Android SQLite索引优化性能

27

我的Android应用程序是通过使用在用户PC上生成并传输到设备上的SQLite数据库来工作的。它一切正常,但我没有预料到会有那么多用户拥有大量数据。在这些情况下,UI非常迟缓,因为它等待数据被获取。

我尝试了许多技巧,我非常确定它们会加快速度,但似乎没有任何显着影响。我的查询几乎都非常简单,通常是WHERE子句中的单个“col=val”,以及列中的INTEGER数据。所以我对查询无能为力。

最新的一次尝试,虽然我不是SQL专家,是在PC上使用“CREATE INDEX”命令,认为这些索引用于加速数据库搜索。索引显著增加了数据库文件的大小,所以我很惊讶它似乎对我的应用程序速度没有任何影响!一个原本需要8秒才能填充的屏幕,即使使用索引也仍需约8秒。我希望至少能将其降低一半。

此时我想知道的是,Android上的SQLite实现是否使用数据库索引,或者我只是浪费空间来生成它们。有人可以回答这个问题吗?

还有其他可以尝试加速访问的方法吗?

(值得一提的是,就绝对情况而言,用户没有任何抱怨。到目前为止,我的最坏情况用户的数据产生了630,000条记录(15个表),因此只有这么多可以做!)

Doug Gordon GHCS系统


2
发布一些慢查询,连同表定义和索引定义。 - Mikpa
3个回答

12

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

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

为了查看SQLite正在使用哪些索引,请查看查询计划。查询计划基于对数据库内容的某些假设。您可以通过使用ANALYZE来改进计划。


12

通过以更加高效的方式查询数据库,我最终成功地实现了巨大的性能提升。例如,在构建信息数组时,以前我需要使用"WHERE _id = n"类型的选择器为每一行查询数据库。但是这样做会逐个发出十几个或更多的查询。

相反,我现在建立所需ID的列表,然后使用形如"WHERE _id IN (n1, n2, n3, ...)"的单个查询获取它们,并迭代返回的游标。通过这样做和一些其他结构优化,最大的数据库现在几乎可以像平均情况那样快速查看。


2
是的,如果可能的话,减少查询量是提高性能最有效的方法之一。因为大量时间都花在等待相对较慢的I/O上。 - pierrotlefou

5
每当您需要执行某些操作(如数据库查找、长时间运算、网络请求等)超过几百毫秒时,您应该考虑将其包装在 AsyncTask 中。 轻松的线程处理 是一篇关于此主题的好文章,所以我建议您仔细阅读它。

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


1
我已经在做这个了。问题在于请求的数据最终显示在 onPostExecute 中需要花费很长时间。 - gordonwd
@gordonwd:我猜(因为你说你正在加载大量数据),你可能会显示一些长列表。如果是这种情况,你可以尝试在这个Android无限列表问题中建议的解决方案(https://dev59.com/U3NA5IYBdhLWcg3wIqLr)。正如上面有人指出的那样,你还应该发布一些来自你的表格和如何从中获取数据的代码,以便我们更好地帮助你。 - Julian
@Nailuj 看起来你的文章链接已经变了,可能是这个: http://android-developers.blogspot.com.au/2009/05/painless-threading.html 但你能验证一下并修复404错误吗? - Dave Anderson

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