Android開發中的SQLite最佳化

來源:互聯網
上載者:User

標籤:

關於SQLite的最佳化,首先是能用SQL語句批次處理的,就不要單筆操作,Cursor就更是能不用就不用。比如成批的DELETE/UPDATE,將條件組裝到SQL語句,會比使用CURSOR一條條的查再刪效率要高很多(若干年前就曾使用預存程序代替單筆操作,將一次批次運算時間從一天縮到了數分鐘以內,參考)。其次是對操作的最佳化:對於INSERT/UPDATE操作較多時使用事務,如果SELECT操作較多時,使用索引。

 

結合現在的工作,發現針對操作的最佳化,下面這篇文章可以翻譯出來歸檔。以下為本文:

 

SQLite有一個簡潔的SQL介面,且以低記憶體佔用著稱。現如今,SQLite已經在Android及iOS開發中得到廣泛的應用。本文主要討論在Android應用如何最佳化SQLite的效能和資源佔用。 

 

1, 使用事務(Transaction)

在預設情況下每一個SQL語句都被包一個全新的事務內,比如執行一個如INSERT這樣基本的資料庫操作,就會放到一個新建立的事務中執行。一次只需要操作一次資料庫操作時,讓SQLite自己來進行交易管理當然是明智的。但如果一次有大量的操作要做時,比如迴圈調用INSERT添加時,這樣就顯得開銷過大了,因為每一筆操作都要重新開啟、寫入,最後再關閉journal檔案, 這個檔案是臨時用來儲存資料操作的中間結果,詳細內容看這裡(參考)。 

 

如果明確地在一系列SQL語句前後以BEGIN TRANSACTION及END TRANSACTION這樣顯示地使用事務就可以避免上面的情況。對於那些不會改變資料的操作,這樣的方式也同樣可以提速(好似資料庫操作中單筆的操作效率將遠低於批次操作,如果用SQL語句可以搞定的事,就不可使用Cursor進行操作)。

 

註明:除了發起事務外,你必須還要負責對事務的提交和復原操作。

 

在Android應用開發中可以使用類似如下的方式使用BEGIN TRANSACTION及END TRANSACTION:

 

 

[java] view plaincopyprint? 
  1. <span style="font-family:Microsoft YaHei;">db.beginTransaction();  
  2. try{  
  3.   for(int i =0; i< LENGTH ; i++,sequenceNum++)  
  4.   {  
  5.   // execute SQL  
  6.   }  
  7.   db.setTransactionSuccessful();// marks a commit  
  8. }  
  9. finally{  
  10.   db.endTransaction();  
  11. }</span>  



 

 

2. 使用索引

如果沒有在資料庫使用索引,當你在一個沒有排序的資料表中使用映射查詢(projection query)搜尋時,無可避免的要執行一個全序列尋找。這種情況通常並不是什麼問題,每種資料庫,包括SQLite都會為資料集執行索引來降低尋找時間。

 

索引維護著一個表中某一列或某幾列的順序,這樣就可以快速定位到一組值,而不用掃遍全表。所有的索引資訊會被儲存在一個獨立的索引表中,所以會產生額外的空間佔用,不過絕對物超所值,特別是當你會在資料庫中進行大量的讀及搜尋操作時。

 

SQLite會自動為每一個UNIQUE欄位建立索引,包括主鍵(Primary Key)欄位,另外也可以通過CREATE INDEX進行顯示地建立。

 

注:如果你的查詢太複雜而無法使用所建立的索引,那你就要好好想想你資料庫的結構了。

 

 

3. 在Where分支中使用限定符

如果以字串拼接出SQL語句的Where,莫不如使用SQLite的query操作帶上‘?‘來編譯查詢。以下是它的好處:

 a. 有利於SQLite緩衝這些查詢及索引。

 b. 可以避免達到SQLite緩衝的上限。使用字串拼接Where的查詢,每一個都被視為不同的查詢,這就容易達到緩衝的上限。

 c. 可以避免非法的SQL注入。

 

關於SQLite的最佳化,首先是能用SQL語句批次處理的,就不要單筆操作,Cursor就更是能不用就不用。比如成批的DELETE/UPDATE,將條件組裝到SQL語句,會比使用CURSOR一條條的查再刪效率要高很多(若干年前就曾使用預存程序代替單筆操作,將一次批次運算時間從一天縮到了數分鐘以內,參考)。其次是對操作的最佳化:對於INSERT/UPDATE操作較多時使用事務,如果SELECT操作較多時,使用索引。

 

結合現在的工作,發現針對操作的最佳化,下面這篇文章可以翻譯出來歸檔。以下為本文:

 

SQLite有一個簡潔的SQL介面,且以低記憶體佔用著稱。現如今,SQLite已經在Android及iOS開發中得到廣泛的應用。本文主要討論在Android應用如何最佳化SQLite的效能和資源佔用。 

 

1, 使用事務(Transaction)

在預設情況下每一個SQL語句都被包一個全新的事務內,比如執行一個如INSERT這樣基本的資料庫操作,就會放到一個新建立的事務中執行。一次只需要操作一次資料庫操作時,讓SQLite自己來進行交易管理當然是明智的。但如果一次有大量的操作要做時,比如迴圈調用INSERT添加時,這樣就顯得開銷過大了,因為每一筆操作都要重新開啟、寫入,最後再關閉journal檔案, 這個檔案是臨時用來儲存資料操作的中間結果,詳細內容看這裡(參考)。 

 

如果明確地在一系列SQL語句前後以BEGIN TRANSACTION及END TRANSACTION這樣顯示地使用事務就可以避免上面的情況。對於那些不會改變資料的操作,這樣的方式也同樣可以提速(好似資料庫操作中單筆的操作效率將遠低於批次操作,如果用SQL語句可以搞定的事,就不可使用Cursor進行操作)。

 

註明:除了發起事務外,你必須還要負責對事務的提交和復原操作。

 

在Android應用開發中可以使用類似如下的方式使用BEGIN TRANSACTION及END TRANSACTION:

 

 

[java] view plaincopyprint? 
  1. <span style="font-family:Microsoft YaHei;">db.beginTransaction();  
  2. try{  
  3.   for(int i =0; i< LENGTH ; i++,sequenceNum++)  
  4.   {  
  5.   // execute SQL  
  6.   }  
  7.   db.setTransactionSuccessful();// marks a commit  
  8. }  
  9. finally{  
  10.   db.endTransaction();  
  11. }</span>  



 

 

2. 使用索引

如果沒有在資料庫使用索引,當你在一個沒有排序的資料表中使用映射查詢(projection query)搜尋時,無可避免的要執行一個全序列尋找。這種情況通常並不是什麼問題,每種資料庫,包括SQLite都會為資料集執行索引來降低尋找時間。

 

索引維護著一個表中某一列或某幾列的順序,這樣就可以快速定位到一組值,而不用掃遍全表。所有的索引資訊會被儲存在一個獨立的索引表中,所以會產生額外的空間佔用,不過絕對物超所值,特別是當你會在資料庫中進行大量的讀及搜尋操作時。

 

SQLite會自動為每一個UNIQUE欄位建立索引,包括主鍵(Primary Key)欄位,另外也可以通過CREATE INDEX進行顯示地建立。

 

注:如果你的查詢太複雜而無法使用所建立的索引,那你就要好好想想你資料庫的結構了。

 

 

3. 在Where分支中使用限定符

如果以字串拼接出SQL語句的Where,莫不如使用SQLite的query操作帶上‘?‘來編譯查詢。以下是它的好處:

 a. 有利於SQLite緩衝這些查詢及索引。

 b. 可以避免達到SQLite緩衝的上限。使用字串拼接Where的查詢,每一個都被視為不同的查詢,這就容易達到緩衝的上限。

 c. 可以避免非法的SQL注入。

 

Android開發中的SQLite最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.