Android SQLITE查询在大量行上运行缓慢

时间:2017-01-02 12:14:37

标签: android sqlite

我有2个表,我需要的查询运行速度很慢。 为了举例说明,我展示了两个带有相关字段的样本表。

Table MAIN
      MAIN.USERID text
      MAIN.LOGGED_USERID text
      MAIN.other text fields not relevant to query
Index on USERID, LOGGED_USERID

Table LOGS
      LOGS.CREATED int
      LOGS.USERID text
      LOGS.LOGGED_USERID text
      LOGS.TYPE int

Index on USERID,LOGGED_USERID,TYPE

我需要从LOGS表中获取USER / LOGGED_USER的最新日期。我需要运行的查询类似于:

Select m.some fields,
   (Select l.CREATED 
    from LOGS l 
    where l.USERID=u.USERID and l.LOGGED_USERID=m.LOGGED_USERID and TYPE=1 
    order by l.CREATED desc limit 1) as LAST_DATE
from MAIN m
WHERE some fields not relevant and an EXIST command from other table
ORDER BY some fields not relevant

虽然查询对于有限数量的行运行正常,但是当每个表上有150.000行时,查询实际上似乎永远不会完成,或者至少我还没有等待那么久。性能下降来自LAST_DATE查询,因为没有它,它是即时的 可能我没有使用索引?

2 个答案:

答案 0 :(得分:0)

您的解决方案执行每行的子查询。

使用连接,只执行一次,然后加入两个表。

以下是获取每个user_id和logger_userid

最后创建的LOGS的查询
Select max(CREATED), LOGGED_USERID, USERID
       from LOGS l 
       where TYPE=1 
       group by LOGGED_USERID, USERID

要在联接中使用它,只需使用别名:

Select m.some fields,
   l.CREATED as LAST_DATE
   from MAIN m
   inner join (Select max(CREATED), LOGGED_USERID, USERID
       from LOGS l 
       where TYPE=1 
       group by LOGGED_USERID, USERID
   ) l on l.USERID = M.USERID ANd l.LOGGED_USERID = M.LOGGED_USERID.
  

注意:我注意到SQLite表示法,我已经在Sybase上工作了太长时间..

这当然需要where和order条件,这只是为了纠正select .. from ...部分

答案 1 :(得分:-1)

由于您没有显示您的代码,我认为您在UI线程中花费了太多工作。因此,通过这个假设你应该使用装载机。在您的情况下光标加载器。加载器基本上运行在单独的线程上,避免了缓慢的UI。 请参阅装载机的链接说明: Loaders in Android