android數據庫優化

Android數據庫優化

瞎扯

其實自己在BAT的某家工作過,另外2家也都面試過,據我工作和面試的情況感覺各大公司對于客戶端數據庫的使用是比較少的,盡量的情況都是在內存中做,或者文件。比如新浪微博大部分的可持久化數據是基于文件的而不是數據庫不知道是基于什么考量。

但是之前我工作的部門是根據谷歌的開發理念是做了基于以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 批量事務插入,提升數據插入的性能

由于sqlite默認每次插入都是事務,需要對文件進行讀寫,那么減少事務次數就能簡書磁盤讀寫次數從而獲得性能提升。

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的方式其實是一樣的原理,只是這里需要特別拿出來說明以下,比如有文件表,還有多媒體文件表,你可以設計成一張文件表,一張多媒體關聯表存放多媒體數據,文件信息還是在文件表中,然后通過外鍵關聯。

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

寫的較為匆忙,暫時不添加任何專題,等我再修改細化下內容!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容