Android資料庫的優化

2021-09-28 18:46:29 字數 2414 閱讀 7778

android資料庫優化

瞎扯但是之前我工作的部門是根據谷歌的開發理念是做了基於以cursor為model,以loader,notify為model和view的雙向關聯機制,同時基於uri設計rest風格的資料訪問,整個這套機制我會在以後的文章中闡述以下, 這裡主要還是寫寫我之前做過的一些資料庫優化的情況。

其實瞎扯內容的核心是想說好像大部分的客戶端開發其實是不重視資料庫的,也沒有遵循android的這一套機制的開發,所以可能使用場景有限。

關於三正規化

三正規化其實講的是資料的唯一性,不可再fen』chai以及低冗餘,但是在現實中因為客戶端開發和伺服器開發的不同,又或者是因為效能要求的不同我們在資料庫設計上並不完全是遵循三正規化的。

關於客戶端的特殊性

其實資料庫設計上來說肯定是伺服器的同學設計的更合理性能更好,但是客戶端也是有其特殊性的,以下是我覺得的幾大特殊情況。

1、資料非持久化

對於客戶端來說資料存在資料庫並不一定是為了持久化,可能是為了更好的結構化和使用,那麼就會存在設計上和伺服器不一樣的地方,我們可以在下垃操作時將資料清除等操作。

2、更能接受冗餘

客戶端的資料和伺服器一比,那簡直就是小巫見大巫,雖然移動裝置的效能與伺服器的效能相比也是小巫見大巫,但是客戶端的開發上我們依然可以接受冗餘來換取更快的查詢速度。

sqlite簡介

sqlite每個資料庫都是以單個檔案的形式存在,這些資料都是以b-tree的資料結構形式儲存在磁碟上。同時sqlite更改資料的時候預設一條語句就是乙個事務,有多少條資料就有多少次磁碟操作。

另外還有乙個很重要的就是sqlite的共享鎖和獨享鎖機制,sqlite在可以寫資料庫之前,它必須先讀這個資料庫,看它是否已經存在了.為了從資料庫檔案讀取,第一步是獲得乙個資料庫檔案的共享鎖。乙個「共享」鎖允許多個資料庫聯接在同一時刻從這個資料庫檔案中讀取資訊。「共享」鎖將不允許其他聯接針對此資料庫進行寫操作。

在修改乙個資料庫之前,sqlite首先得擁有乙個針對資料庫檔案的「reserved」鎖。reserved鎖類似於共享鎖,它們都允許其他資料庫連線讀取資訊。單個reserved 鎖能夠與其他程序的多個共享鎖一起協作。然後乙個資料庫檔案同時只能存在乙個reserved 。因此只能有乙個程序在某一時刻嘗試去寫乙個資料庫檔案。

然後將此鎖提公升成乙個獨享鎖,乙個臨界鎖允許其他所有已經取得共享鎖的程序從資料庫檔案中繼續讀取資料。但是它會阻止新的共享鎖的生成。也就說,臨界鎖將會防止因大量連續的讀操作而無法獲得寫入的機會。

所以從sqlite本身的機制看來事務的方式去提交資料,本身是多執行緒乃至多程序資料安全的,但是android在併發寫的時候還是會爆出資料庫鎖住的異常,我們在開發過程中需要盡量避免。

索引簡介

開發注意事項

基於以上的情況來看,我個人在開發中會分為以下兩種情況注意效能的優化。

1、資料庫效能上

1.1 批量事務插入,提公升資料插入的效能

1.2 單條sql優於多條sql

實測發現,對於幾十條sql插入當你替換成單條sql時效能有所提公升,但是這裡要注意的是,換成單條可讀性較差,同時會出現sql超長的錯誤。

1.3 讀和寫操作是互斥的,寫操作過程中可以休眠讓讀操作進行

由於第一步所說的多資料事務插入,從而會導致插入時間增長那麼也會影響資料展示的速度,所以可以在插入過程中休眠操作,以便給讀操作流出時間展示資料。

1.4 使用索引

適當的索引的好處是讓讀取變快,當然帶來的影響就是資料插入修改的時間增加,因為還得維護索引的變化。不過對於大部分的讀操作多於寫操作的資料庫來說索引還是十分有必要的。關於如何設計索引,可以參考下面這個文章:

索引優化

1.5 使用聯合索引

過多的索引同時也會減慢讀取的速度,很典型的乙個情況就是比如要同時根據省市區縣查詢,又可以根據年月日查詢,如果每個都做索引那麼讀取速度將會顯著降低。

對於這種有層級關係的關鍵字,就可以考慮聯合索引了,比如首先根據省查詢,然後根據省市查詢,層層遞進到省市區縣的查詢方式,就可以使用聯合索引,效果非常好。

1.6 勿使用過多索引

1.7 增加查詢條件

當你只要一條資料時增加limit 1,這樣搜尋到了後面的就不會再查詢了,大大的加快了速度

1.8 提前將字段的index對映好

減少getcolumnindex的時間,可以縮短一半的時間

2、資料庫設計上

2.1 通過冗餘換取查詢速度

2.2 減少資料來提公升查詢速度

比如下拉操作時,先清除舊資料,再插入新資料保證資料庫中的資料總量小,提公升查詢速度。

2.3 避免大資料多表的聯合查詢

和2.1的方式其實是一樣的原理,只是這裡需要特別拿出來說明以下,比如有檔案表,還有多**檔案表,你可以設計成一張檔案表,一張多**關聯表存放多**資料,檔案資訊還是在檔案表中,然後通過外來鍵關聯。

但是如果兩個表資料很多,主鍵還不一致同時資料從伺服器下來的數序也不一致那麼,兩個表的聯合查詢出來的資料要慢的多,這個時候就可以用冗餘來喚起查詢速度了。

Android資料庫SQLite效能優化技巧

對於android使用的資料庫而言,官方提供了開源的sqlite,由於支援sql語言查詢底層開源整體效能表現的比較穩定,如果提高你的android資料庫效能?下面android開發網就平時用到的技巧和大家分享 1.相對於封裝過的contentprovider而言,使用原始sql語句執行效率高,比如使...

資料庫優化 資料庫設計優化

一 索引優化 1.首先索引不是越多越好,要視情況而定。因為索引會降低insert和update的效率 insert和update有時可能會重建索引。2.乙個表的索參數量最好不要超過6個,擇優而建。3.專案上線後,根據使用者的查詢條件字段稍微調整資料庫中的字段索引。二 分表 1.縱切 根據表字段來且分...

筆記(一) Android資料庫及優化

今天開始寫筆記,總結一下。首先感謝一下下面的此篇部落格作者,講解的很詳細 一 資料型別 null null integer 整型 real 布林型別 text 文字字串 blob 大文字,儲存格式 smallint 16位整數 integer 32位整數 decimal p,s p是精確值,s是小數...