簡體   English   中英

Android SQLITE查詢在大量行上速度較慢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM