一次 SQLite 性能優(yōu)化

最早接觸 iOS 開(kāi)發(fā)了解到的第一個(gè)緩存數(shù)據(jù)庫(kù)就是 SQLite嗽上,后面一直也以 SQLite 作為中堅(jiān)力量使用喊暖,以前沒(méi)有接觸到比較大量數(shù)據(jù)的讀寫(xiě)帅涂,所以在性能優(yōu)化方面關(guān)注不多轻掩,這次對(duì)一個(gè)特定場(chǎng)景的較多數(shù)據(jù)批量讀寫(xiě)做了一個(gè)性能優(yōu)化幸乒,使性能提高了十倍。

大致應(yīng)用場(chǎng)景是這樣:


每次程序啟動(dòng)會(huì)從服務(wù)器拉取一些數(shù)據(jù)唇牧,對(duì)本地?cái)?shù)據(jù)庫(kù)兩個(gè)表進(jìn)行同步更新罕扎,不存在就寫(xiě)入,存在就更新其字段丐重。數(shù)據(jù)少的時(shí)候幾十條腔召,多的上千條。


由于緩存的數(shù)據(jù)可能會(huì)存在異步同時(shí)讀寫(xiě)扮惦,所以做了一個(gè)后臺(tái)同步隊(duì)列臀蛛,所有的緩存數(shù)據(jù)庫(kù)操作都在這個(gè)隊(duì)列里面,然后我監(jiān)控了一下寫(xiě)數(shù)據(jù)庫(kù)的關(guān)鍵代碼執(zhí)行耗時(shí),一千條數(shù)據(jù)更新到數(shù)據(jù)庫(kù)就能耗時(shí) 30 秒之久浊仆,磁盤(pán)寫(xiě)入在 1.5M/s 浮動(dòng)客峭, 雖然沒(méi)有卡主線程,這個(gè)消耗即使在后臺(tái)也是不可容忍的抡柿。

核心的數(shù)據(jù)庫(kù)操作大概是這樣的

for 1000 : {

Select -> Update Or Insert

Select -> Update Or Insert

}

由于牽涉到兩張表舔琅,所以會(huì)有兩次,經(jīng)過(guò)測(cè)試洲劣,Select 一次幾乎沒(méi)有多少消息备蚓,可是 Update 或者 Insert ( [FMDatabaseQueue executeUpdate:] ) 就消耗大了,因?yàn)闀?huì)寫(xiě)入磁盤(pán)囱稽,然后想到是不是可以把所有的 SQL 語(yǔ)句拼接起來(lái)郊尝,最后只想一次;再后來(lái)想到 SQLite 不是有事務(wù) ( Transaction ) 嘛战惊,于是嘗試了一下利用 FMDB 的事務(wù)操作流昏,在循環(huán)開(kāi)始前[db beginTransaction],循環(huán)結(jié)束[db commit]吞获,包起來(lái)就行了横缔。

增加事務(wù)之后的大概邏輯:

beginTransaction

for 1000 : {

Select -> Update Or Insert

Select -> Update Or Insert

}

commit

測(cè)試效果非常好,整個(gè)耗時(shí)從 30 秒下降到了2.8 秒左右衫哥,僅僅增加了兩行代碼。


總結(jié):

? ? ? ? ? 踩過(guò)的坑襟锐,走過(guò)的坎撤逢,都是以后的經(jīng)驗(yàn)

雖然利用事務(wù)取巧來(lái)提高了性能,但是這樣做其實(shí)并不安全粮坞,好在所屬場(chǎng)景對(duì)這部分?jǐn)?shù)據(jù)絕對(duì)一致要求不是太高蚊荣。

模擬器和真機(jī)有時(shí)候測(cè)試并不能重現(xiàn)同一個(gè)問(wèn)題,因?yàn)樗鶎偌軜?gòu)莫杈、CPU互例、硬盤(pán)都不一樣,所以性能測(cè)試最好還是以真機(jī)為準(zhǔn)筝闹。該問(wèn)題測(cè)試的時(shí)候在模擬器上很多問(wèn)題都沒(méi)有媳叨,因?yàn)橛脖P(pán)比真機(jī)讀寫(xiě)速度要高,所以避免了很多問(wèn)題关顷,測(cè)試的時(shí)候也就沒(méi)有發(fā)現(xiàn)糊秆。

數(shù)據(jù)庫(kù)設(shè)計(jì)設(shè)計(jì)的時(shí)候得多考慮考慮,多想想以后怎么擴(kuò)展议双,怎么升級(jí)痘番,讀寫(xiě)的時(shí)候性能怎么樣?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子汞舱,更是在濱河造成了極大的恐慌伍纫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昂芜,死亡現(xiàn)場(chǎng)離奇詭異莹规,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)说铃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)访惜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腻扇,你說(shuō)我怎么就攤上這事债热。” “怎么了幼苛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵窒篱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舶沿,道長(zhǎng)墙杯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任括荡,我火速辦了婚禮高镐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畸冲。我一直安慰自己嫉髓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布邑闲。 她就那樣靜靜地躺著算行,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苫耸。 梳的紋絲不亂的頭發(fā)上州邢,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音褪子,去河邊找鬼量淌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛褐筛,可吹牛的內(nèi)容都是我干的类少。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼渔扎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼硫狞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤残吩,失蹤者是張志新(化名)和其女友劉穎财忽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泣侮,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡即彪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了活尊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隶校。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛹锰,靈堂內(nèi)的尸體忽然破棺而出深胳,到底是詐尸還是另有隱情,我是刑警寧澤铜犬,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布舞终,位于F島的核電站,受9級(jí)特大地震影響癣猾,放射性物質(zhì)發(fā)生泄漏敛劝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一纷宇、第九天 我趴在偏房一處隱蔽的房頂上張望夸盟。 院中可真熱鬧,春花似錦像捶、人聲如沸满俗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至五芝,卻和暖如春痘儡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枢步。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工沉删, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醉途。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓矾瑰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親隘擎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殴穴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容