交換數(shù)據(jù)格式
濱城網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,濱城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為濱城成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的濱城做網(wǎng)站的公司定做!
Google 推出的 Protocal Buffers 是一種更輕便高效的存儲結(jié)構(gòu),但消耗內(nèi)存較大。
FlatBuffers 同樣由 Google 推出,專注性能,適合移動端。占用存儲比 Protocal 要大。
SharePreferences 優(yōu)化
Bitmap 解碼
數(shù)據(jù)庫優(yōu)化
1、使用 StringBuilder 代替 String
2、查詢時返回更少的結(jié)果集及更少的字段
查詢時只取需要的字段和結(jié)果集,更多的結(jié)果集會消耗更多的時間及內(nèi)存,更多的字段會導(dǎo)致更多的內(nèi)存消耗。
3、少用 cursor.getColumnIndex
根據(jù)性能調(diào)優(yōu)過程中的觀察 cursor.getColumnIndex 的時間消耗跟 cursor.getInt 相差無幾。可以在建表的時候用 static 變量記住某列的 index,直接調(diào)用相應(yīng) index 而不是每次查詢。
4、異步線程
Android 中數(shù)據(jù)不多時表查詢可能耗時不多,不會導(dǎo)致 ANR,不過大于 100ms 時同樣會讓用戶感覺到延時和卡頓,可以放在線程中運行,但 sqlite 在并發(fā)方面存在局限,多線程控制較麻煩,這時候可使用單線程池,在任務(wù)中執(zhí)行 db 操作,通過 handler 返回結(jié)果和 UI 線程交互,既不會影響 UI 線程,同時也能防止并發(fā)帶來的異常。
5、SQLiteOpenHelper 維持一個單例
因為 SQLite 對多線程的支持并不是很完善,如果兩個線程同時操作數(shù)據(jù)庫,因為數(shù)據(jù)庫被另一個線程占用, 這種情況下會報“Database is locked” 的異常。所以在數(shù)據(jù)庫管理類中使用單例模式,就可以保證無論在哪個線程中獲取數(shù)據(jù)庫對象,都是同一個。
最好的方法是所有的數(shù)據(jù)庫操作統(tǒng)一到同一個線程隊列管理,而業(yè)務(wù)層使用緩存同步,這樣可以完全避免多線程操作數(shù)據(jù)庫導(dǎo)致的不同步和死鎖問題。
6、Application 中初始化
7、少用 AUTOINCREMENT
主鍵加上 AUTOINCREMENT 后,可以保證主鍵嚴(yán)格遞增,但并不能保證每次都加 1,因為在插入失敗后,失敗的行號不會被復(fù)用,會造成主鍵有間隔,繼而使 INSERT 耗時 1 倍以上。
這個 AUTOINCREMENT 關(guān)鍵詞會增加 CPU,內(nèi)存,磁盤空間和磁盤 I/O 的負(fù)擔(dān),所以 盡量不要用,除非必需。通常情況下都不是必需的。
事務(wù)
使用事務(wù)的兩大好處是原子提交和更優(yōu)性能:
主要三個方法:beginTransaction,setTransactionSuccessful,endTransaction。
SQLiteStatement
使用 Android 系統(tǒng)提供的 SQLiteStatement 來插入數(shù)據(jù),在性能上有一定的提高,并且也解決了 SQL 注入的問題。
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 只能插入一個表中的數(shù)據(jù),在插入前要清除上一次的數(shù)據(jù)。
索引
索引就像書本的目錄,目錄可以快速找到所在頁數(shù),數(shù)據(jù)庫中索引可以幫助快速找到數(shù)據(jù),而不用全表掃描,合適的索引可以大大提高數(shù)據(jù)庫查詢的效率。
優(yōu)點:大大加快了數(shù)據(jù)庫檢索的速度,包括對單表查詢、連表查詢、分組查詢、排序查詢。經(jīng)常是一到兩個數(shù)量級的性能提升,且隨著數(shù)據(jù)數(shù)量級增長。
缺點:
分類
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、單個索引和復(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)為非聚簇索引使用場景
(>, <, =,>=, <=)
或 order by
、group by
發(fā)生時建議使用索引。并且選擇度(一個字段中唯一值的數(shù)量 / 總的數(shù)量)越大,建索引越有優(yōu)勢使用規(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)化
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。