2012-10-11 98 views
1

我有一個龐大的數據庫,我希望我的應用程序儘快與它一起工作。我使用的是Android,所以資源更受限制。我知道在sqlite數據庫中存儲大量數據並不是一個好主意,但我需要這個。快速只讀sqlite數據庫

每個數據庫只包含一個表格,我只使用它。

您可以給我什麼建議來儘可能優化數據庫。我已經閱讀this後,除了PRAGMA命令我還能使用什麼?

也許有一些特殊的類型限制只讀查詢的表,但主要比普通表類型更快?

回答

0

巨大是相對的。但最終設備受限於存儲和內存。因此,假設巨大的設備超出了設備的典型限制,您有幾個選擇。

第一個選項是將您的大型數據集存儲在雲中,並且連接的設備可以通過提供雲服務,例如來自coud的RESTful API將數據提供給設備,從而爲這些數據提供視圖。如果設備和應用依賴於始終連接,則除非要緩存數據,否則不需要太多的本地存儲。

另一種方法是偶爾連接的設備(有時是離線的),您可以在其中下拉一部分與設備相關的最相關數據。在這種模式下,你可以離線工作並推送/回拉到雲端。在這個模型中,sqlite是保存相關數據片的存儲機制。

編輯基於評論:

關於優化你的設備是什麼,請參閱優化常見問題在這裏:

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

(根據有效的粗糙順序)

  1. 使用內存數據庫
  2. 使用BEGIN TRANSACTION和END TRANSACTION
  3. 使用索引使用PRAGMA CACHE_SIZE
  4. 使用PRAGMA同步= OFF
  5. 壓縮數據庫
  6. 使用PRAGMA count_changes = OFF
+0

雲是不可接受的。第一個原因是應用程序應該在有或沒有互聯網連接的情況下工作。第二個原因 - 應用程序在實時模式下處理大量數據,所以它會減慢進度。我其實不擔心數據庫的存儲,我擔心查詢 – pleerock

+0

的快速感謝您的答覆。我不擔心設備上數據庫的大小。大小不是問題。我擔心查詢時間。我想盡快將結果提供給用戶,所以我正在尋找一些技巧,可以幫助查詢時間 – pleerock

+0

OK - 我添加了一些優化點。 – bryanmac

1

只要更換內存分配庫作爲數據庫擬合在設備上,沒有問題;你將只有更少的空間用於其他應用程序。

沒有特殊的表格類型。但是,如果您的查詢僅使用表格列的子集,並且您有足夠的空間,請考慮添加一個或多個covering indexes

被讀取,只允許數據庫在桌面上進行優化,在部署之前:

  • 設置頁面大小,等等。;
  • 創建有用的索引;
  • ANALYZE
  • VACUUM

在您的應用程序,你可能會增加page cache size實驗,但如果你的工作集比可用內存越大,無論如何也不會幫助。無論如何,從閃存中隨機讀取的速度都很快,所以這不成問題。

+0

ANALYZE&VACUUM命令似乎很容易使用.. – pleerock

0

也許我是說明顯的,但你可能應該打開它SQLITE_OPEN_READONLY標誌sqlite3_open:我認爲SQLite將利用這一事實並優化引擎的行爲。

注意,一切正常SQL(ITE)優化技巧仍然適用(比如吸塵敲定數據庫,在創建數據庫,適當的索引等...設置正確的頁面大小)

此外,如果你有多個線程在應用程序訪問數據庫,您可能還希望嘗試一下SQLITE_OPEN_NOMUTEXSQLITE_OPEN_SHAREDCACHE標誌(他們需要sqlite3_open_v2,雖然)