[英]Android SQLITE query slow on large number of rows
我有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查詢,因為沒有它,這是即時的可能是我沒有使用的索引?
您可以對每一行執行子查詢。
使用聯接,將只執行一次,然后聯接兩個表。
這是獲取每個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上工作了太長時間了..
當然,這仍然需要在何處和順序的條件,這只是為了糾正select .. from ...
部分中的select .. from ...
因為您沒有顯示代碼,所以我認為您正在UI線程上進行過多的工作。 因此,通過這種假設,您應該使用Loader。 在您的情況下, 游標裝載器 。 加載程序基本上在單獨的線程上運行,並避免了緩慢的UI。 請參閱說明的加載程序鏈接: Android中的加載程序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.