2010-11-28 46 views
24

我的Android應用程序通過使用在用戶PC上生成並傳輸到設備的SQLite數據庫工作。這一切都有效,但我沒有預料到會有大量數據的用戶數量。在這些情況下,用戶界面非常緩慢,因爲它等待數據被提取。具有索引的Android SQLite性能

我試過了一些技巧,我確定會加快速度,但似乎沒有任何明顯的效果。我的查詢幾乎都非常簡單,通常是WHERE子句的單個「col = val」和列中的INTEGER數據。所以我不能在查詢方面做很多事情。

最新的,我不是一個SQL專家的任何手段,是在PC上使用「CREATE INDEX」命令,相信這些索引是用來加快數據庫搜索。索引顯着增加了數據庫文件的大小,所以我很驚訝這似乎對我的應用程序的速度沒有任何影響!即使在使用索引時,需要8秒才能填充索引的屏幕仍需要8秒左右的時間。我希望把事情減少到至少一半。

我在這裏想知道的是,如果Android上的SQLite實現完全使用數據庫索引,或者我只是通過生成它們而浪費空間。任何人都可以回答嗎?

此外,任何其他的事情,以嘗試加快訪問?

(對於它的價值,一個絕對的基礎上,用戶有什麼可抱怨的。我的最壞情況下的用戶迄今已產生63萬條記錄(15桌)的數據,所以只有這麼多,有可能!)

道格·戈登 GHCS系統

+1

發佈了一些緩慢的查詢,以及表定義和索引定義 – Mikpa 2010-11-28 21:17:41

回答

4

每當你要執行某種動作(即數據庫查找,長時間運行的計算,Web請求等)採取比一對夫婦幾百毫秒的越多,你應該考慮將其包裝在AsyncTask之內。

Painless Threading是關於這個話題的好文章,所以我建議你仔細看看它。

本文討論使用的Android應用程序和 應用程序如何通過生成工作線程 處理長時間運行的操作,確保最好的用戶界面 性能絲扣 模型 ,而不是在主 線程處理它們。

+1

我已經這樣做了。問題是在最終顯示請求的數據之前花費的時間(在onPostExecute中)。 – gordonwd 2010-11-28 20:52:39

+0

@gordonwd:我想(因爲你說你正在加載這麼多的數據),你會顯示一些長列表。如果是這種情況,你可以按照這個* Android無盡列表*問題(http://stackoverflow.com/questions/1080811/android-endless-list)中的建議嘗試解決方案。正如有人指出的那樣,您還應該從表格中發佈一些代碼,以及如何從我們這裏獲取數據,以便更好地爲您提供幫助。 – Nailuj 2010-11-28 21:55:25

10

如果查詢適合,SQLite將使用該索引。使用EXPLAIN

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

查看SQLite正在使用的索引。查詢計劃基於對數據庫內容的一些假設。您可能可以通過使用ANALYZE

11

改進計劃我終於可以通過以更高效的方式查詢數據庫而獲得巨大的性能提升。例如,在建立一個信息數組時,我以前使用「WHERE _id = n」類型選擇器查詢數據庫中的每一行。但是通過這種方式,我一次只發出一打或更多的查詢。我現在建立一個需要的ID列表,然後用「WHERE _id IN(n1,n2,n3,...)」形式的單個查詢得到它們,然後遍歷返回的光標。通過這樣做以及其他一些結構優化,現在最大的數據庫幾乎可以像平均情況一樣快速地查看。