我有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查询,因为没有它,它是即时的 可能我没有使用索引?
答案 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