您好,登錄后才能下訂單哦!
交換數(shù)據(jù)格式
Google 推出的 Protocal Buffers 是一種更輕便高效的存儲(chǔ)結(jié)構(gòu),但消耗內(nèi)存較大。
FlatBuffers 同樣由 Google 推出,專注性能,適合移動(dòng)端。占用存儲(chǔ)比 Protocal 要大。
SharePreferences 優(yōu)化
Bitmap 解碼
數(shù)據(jù)庫(kù)優(yōu)化
1、使用 StringBuilder 代替 String
2、查詢時(shí)返回更少的結(jié)果集及更少的字段
查詢時(shí)只取需要的字段和結(jié)果集,更多的結(jié)果集會(huì)消耗更多的時(shí)間及內(nèi)存,更多的字段會(huì)導(dǎo)致更多的內(nèi)存消耗。
3、少用 cursor.getColumnIndex
根據(jù)性能調(diào)優(yōu)過(guò)程中的觀察 cursor.getColumnIndex 的時(shí)間消耗跟 cursor.getInt 相差無(wú)幾??梢栽诮ū淼臅r(shí)候用 static 變量記住某列的 index,直接調(diào)用相應(yīng) index 而不是每次查詢。
4、異步線程
Android 中數(shù)據(jù)不多時(shí)表查詢可能耗時(shí)不多,不會(huì)導(dǎo)致 ANR,不過(guò)大于 100ms 時(shí)同樣會(huì)讓用戶感覺(jué)到延時(shí)和卡頓,可以放在線程中運(yùn)行,但 sqlite 在并發(fā)方面存在局限,多線程控制較麻煩,這時(shí)候可使用單線程池,在任務(wù)中執(zhí)行 db 操作,通過(guò) handler 返回結(jié)果和 UI 線程交互,既不會(huì)影響 UI 線程,同時(shí)也能防止并發(fā)帶來(lái)的異常。
5、SQLiteOpenHelper 維持一個(gè)單例
因?yàn)?SQLite 對(duì)多線程的支持并不是很完善,如果兩個(gè)線程同時(shí)操作數(shù)據(jù)庫(kù),因?yàn)閿?shù)據(jù)庫(kù)被另一個(gè)線程占用, 這種情況下會(huì)報(bào)“Database is locked” 的異常。所以在數(shù)據(jù)庫(kù)管理類中使用單例模式,就可以保證無(wú)論在哪個(gè)線程中獲取數(shù)據(jù)庫(kù)對(duì)象,都是同一個(gè)。
最好的方法是所有的數(shù)據(jù)庫(kù)操作統(tǒng)一到同一個(gè)線程隊(duì)列管理,而業(yè)務(wù)層使用緩存同步,這樣可以完全避免多線程操作數(shù)據(jù)庫(kù)導(dǎo)致的不同步和死鎖問(wèn)題。
6、Application 中初始化
7、少用 AUTOINCREMENT
主鍵加上 AUTOINCREMENT 后,可以保證主鍵嚴(yán)格遞增,但并不能保證每次都加 1,因?yàn)樵诓迦胧『?,失敗的行?hào)不會(huì)被復(fù)用,會(huì)造成主鍵有間隔,繼而使 INSERT 耗時(shí) 1 倍以上。
這個(gè) AUTOINCREMENT 關(guān)鍵詞會(huì)增加 CPU,內(nèi)存,磁盤(pán)空間和磁盤(pán) I/O 的負(fù)擔(dān),所以 盡量不要用,除非必需。通常情況下都不是必需的。
事務(wù)
使用事務(wù)的兩大好處是原子提交和更優(yōu)性能:
主要三個(gè)方法:beginTransaction,setTransactionSuccessful,endTransaction。
SQLiteStatement
使用 Android 系統(tǒng)提供的 SQLiteStatement 來(lái)插入數(shù)據(jù),在性能上有一定的提高,并且也解決了 SQL 注入的問(wèn)題。
SQLiteStatement statement = dbOpenHelper.getWritableDatabase().compileStatement("INSERT INTO EMPERORS(name, dynasty, start_year) values(?,?,?)"); statement.clearBindings(); statement.bindString(1, "Max"); statement.bindString(2, "Luk"); statement.bindString(3, "1998"); statement.executeInsert();
SQLiteStatement 只能插入一個(gè)表中的數(shù)據(jù),在插入前要清除上一次的數(shù)據(jù)。
索引
索引就像書(shū)本的目錄,目錄可以快速找到所在頁(yè)數(shù),數(shù)據(jù)庫(kù)中索引可以幫助快速找到數(shù)據(jù),而不用全表掃描,合適的索引可以大大提高數(shù)據(jù)庫(kù)查詢的效率。
優(yōu)點(diǎn):大大加快了數(shù)據(jù)庫(kù)檢索的速度,包括對(duì)單表查詢、連表查詢、分組查詢、排序查詢。經(jīng)常是一到兩個(gè)數(shù)量級(jí)的性能提升,且隨著數(shù)據(jù)數(shù)量級(jí)增長(zhǎng)。
缺點(diǎn):
分類
1、直接創(chuàng)建索引和間接創(chuàng)建索引
CREATE INDEX mycolumn_index ON mytable (myclumn)
2、普通索引和唯一性索引
CREATEINDEXmycolumn_indexONmytable(myclumn)
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
3、單個(gè)索引和復(fù)合索引
CREATEINDEXname_indexONusername(firstname,lastname),
其中 firstname 為前導(dǎo)列。4、聚簇索引和非聚簇索引 (聚集索引,群集索引)
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW
,其中 WITH ALLOW_DUP_ROW
表示允許有重復(fù)記錄的聚簇索引CREATEUNCLUSTEREDINDEXmycolumn_cindexONmytable(mycolumn),
索引默認(rèn)為非聚簇索引使用場(chǎng)景
(>, <, =,>=, <=)
或 order by
、group by
發(fā)生時(shí)建議使用索引。并且選擇度(一個(gè)字段中唯一值的數(shù)量 / 總的數(shù)量)越大,建索引越有優(yōu)勢(shì)使用規(guī)則
create unique index PK_GRADE_CLASS on student (grade, class)
,select * from student where class = 2
未使用到索引,select * from dept where grade = 3
使用到了索引select * from student where tochar(grade)='2
其它通用優(yōu)化
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。