国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Android性能優化之數據庫優化

移動開發 Android
本文為性能優化的第一篇——數據庫性能優化,原理適用于大部分數據庫包括Sqlite、Mysql、Oracle、Sql server,詳細介紹了索引(優缺點、分類、場景、規則)和事務,最后介紹了部分單獨針對Sqlite的優化。

1、索引
簡單的說,索引就像書本的目錄,目錄可以快速找到所在頁數,數據庫中索引可以幫助快速找到數據,而不用全表掃描,合適的索引可以大大提高數據庫查詢的效率。
(1). 優點
大大加快了數據庫檢索的速度,包括對單表查詢、連表查詢、分組查詢、排序查詢。經常是一到兩個數量級的性能提升,且隨著數據數量級增長。

(2). 缺點
索引的創建和維護存在消耗,索引會占用物理空間,且隨著數據量的增加而增加。
在對數據庫進行增刪改時需要維護索引,所以會對增刪改的性能存在影響。

(3). 分類
a. 直接創建索引和間接創建索引
直接創建: 使用sql語句創建,Android中可以在SQLiteOpenHelper的onCreate或是onUpgrade中直接excuSql創建語句,語句如

  1. CREATE INDEX mycolumn_index ON mytable (myclumn) 

間接創建: 定義主鍵約束或者唯一性鍵約束,可以間接創建索引,主鍵默認為唯一索引。

b. 普通索引和唯一性索引
普通索引:

  1. CREATE INDEX mycolumn_index ON mytable (myclumn) 

唯一性索引:保證在索引列中的全部數據是唯一的,對聚簇索引和非聚簇索引都可以使用,語句為

  1. CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn) 

c. 單個索引和復合索引

單個索引:索引建立語句中僅包含單個字段,如上面的普通索引和唯一性索引創建示例。
復合索引:又叫組合索引,在索引建立語句中同時包含多個字段,語句如:

CREATE INDEX name_index ON username(firstname, lastname)

  1. CREATE INDEX name_index ON username(firstname, lastname) 

其中firstname為前導列。

d. 聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,與基表的物理順序相同,數據值的順序總是按照順序排列,語句為:

  1. CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW 

其中WITH ALLOW_DUP_ROW表示允許有重復記錄的聚簇索引

非聚簇索引:

  1. CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) 

索引默認為非聚簇索引

(4). 使用場景
在上面講到了優缺點,那么肯定會對何時使用索引既有點明白又有點糊涂吧,那么下面總結下:
a.  當某字段數據更新頻率較低,查詢頻率較高,經常有范圍查詢(>, <, =, >=, <=)或order by、group by發生時建議使用索引。并且選擇度越大,建索引越有優勢,這里選擇度指一個字段中唯一值的數量/總的數量。
b.  經常同時存取多列,且每列都含有重復值可考慮建立復合索引

(5). 索引使用規則
a.  對于復合索引,把使用最頻繁的列做為前導列(索引中***個字段)。如果查詢時前導列不在查詢條件中則該復合索引不會被使用。

  1. create unique index PK_GRADE_CLASS on student (grade, class) 


 

  1. select * from student where class = 2未使用到索引 
  2. select * from dept where grade = 3使用到了索引 

b.  避免對索引列進行計算,對where子句列的任何計算如果不能被編譯優化,都會導致查詢時索引失效
 

  1. select * from student where tochar(grade)=’2′ 


c.  比較值避免使用NULL
d.  多表查詢時要注意是選擇合適的表做為內表。連接條件要充份考慮帶有索引的表、行數多的表,內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為***方案。實際多表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案并從中找出系統開銷最小的***方案。

e.  查詢列與索引列次序一致
f.  用多表連接代替EXISTS子句
g.  把過濾記錄數最多的條件放在最前面
h.  善于使用存儲過程,它使sql變得更加靈活和高效(Sqlite不支持存儲過程::>_<:: )

(6)索引檢驗

建立了索引,對于某條sql語句是否使用到了索引可以通過執行計劃查看是否用到了索引。

2、使用事務
使用事務的兩大好處是原子提交和更優性能。
(1) 原子提交
原則提交意味著同一事務內的所有修改要么都完成要么都不做,如果某個修改失敗,會自動回滾使得所有修改不生效。

(2) 更優性能
Sqlite默認會為每個插入、更新操作創建一個事務,并且在每次插入、更新后立即提交。

這樣如果連續插入100次數據實際是創建事務->執行語句->提交這個過程被重復執行了100次。如果我們顯示的創建事務->執行100條語句->提交會使得這個創建事務和提交這個過程只做一次,通過這種一次性事務可以使得性能大幅提升。尤其當數據庫位于sd卡時,時間上能節省兩個數量級左右。

Sqlte顯示使用事務,示例代碼如下:


  1. public void insertWithOneTransaction() { 
  2.     SQLiteDatabase db = sqliteOpenHelper.getWritableDatabase(); // Begins a transaction  db.beginTransaction(); 
  3. try { // your sqls for (int i = 0; i < 100; i++) { 
  4.             db.insert(yourTableName, null, value); 
  5.         } // marks the current transaction as successful  db.setTransactionSuccessful(); 
  6.     } catch (Exception e) { // process it  e.printStackTrace(); 
  7.     } finally { // end a transaction  db.endTransaction(); 
  8.     } 

其中sqliteOpenHelper.getWritableDatabase()表示得到寫表權限。

3、其他優化
(1) 語句的拼接使用StringBuilder代替String
這個就不多說了,簡單的string相加會導致創建多個臨時對象消耗性能。StringBuilder的空間預分配性能好得多。如果你對字符串的長度有大致了解,如100字符左右,可以直接new StringBuilder(128)指定初始大小,減少空間不夠時的再次分配。

(2) 讀寫表

在寫表時調用sqliteOpenHelper..getWritableDatabase(),在讀表時候調用sqliteOpenHelper..getReadableDatabase(),getReadableDatabase性能更優。

(3) 查詢時返回更少的結果集及更少的字段。
查詢時只取需要的字段和結果集,更多的結果集會消耗更多的時間及內存,更多的字段會導致更多的內存消耗。

(4) 少用cursor.getColumnIndex

根據性能調優過程中的觀察cursor.getColumnIndex的時間消耗跟cursor.getInt相差無幾。可以在建表的時候用static變量記住某列的index,直接調用相應index而不是每次查詢。


  1. public static final String       HTTP_RESPONSE_TABLE_ID = android.provider.BaseColumns._ID;
  2. public static final String       HTTP_RESPONSE_TABLE_RESPONSE = "response"public List<Object> getData() { 
  3.     …… 
  4.     cursor.getString(cursor.getColumnIndex(HTTP_RESPONSE_TABLE_RESPONSE)); 
  5.     …… 

優化為

public static final String HTTP_RESPONSE_TABLE_ID = android.provider.BaseColumns._ID;  public static final String HTTP_RESPONSE_TABLE_RESPONSE  = "response";  public static final int HTTP_RESPONSE_TABLE_ID_INDEX  = 0;  public static final int HTTP_RESPONSE_TABLE_URL_INDEX = 1;  public List<Object> getData() {     ……     cursor.getString(HTTP_RESPONSE_TABLE_RESPONSE_INDEX);     …… }

 

4、異步線程
Sqlite是常用于嵌入式開發中的關系型數據庫,完全開源。
與Web常用的數據庫Mysql、Oracle db、sql server不同,Sqlite是一個內嵌式的數據庫,數據庫服務器就在你的程序中,無需網絡配置和管理,數據庫服務器端和客戶端運行在同一進程內,減少了網絡訪問的消耗,簡化了數據庫管理。不過Sqlite在并發、數據庫大小、網絡方面存在局限性,并且為表級鎖,所以也沒必要多線程操作。

 

Android中數據不多時表查詢可能耗時不多,不會導致anr,不過大于100ms時同樣會讓用戶感覺到延時和卡頓,可以放在線程中運行,但sqlite在并發方面存在局限,多線程控制較麻煩,這時候可使用單線程池,在任務中執行db操作,通過handler返回結果和ui線程交互,既不會影響UI線程,同時也能防止并發帶來的異常。實例代碼如下:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); singleThreadExecutor.execute(new Runnable() {       @Override public void run() {  // db operetions, u can use handler to send message after db.insert(yourTableName, null, value);          handler.sendEmptyMessage(xx);     } });
責任編輯:張葉青 來源: 開源社區
相關推薦

2023-07-12 08:55:16

PawSQL數據庫

2018-03-30 14:30:10

數據庫SQL語句性能優化

2018-03-30 13:59:22

數據庫SQL語句性能優化

2011-03-31 09:19:54

數據庫優化

2021-07-29 14:20:34

網絡優化移動互聯網數據存儲

2021-01-31 17:50:41

數據庫查詢程序員

2011-05-20 10:30:20

ORACLE數據庫性能優化

2011-05-18 09:39:19

Oracle數據庫性能優化

2019-12-13 10:25:08

Android性能優化啟動優化

2013-02-20 14:32:37

Android開發性能

2014-07-18 09:33:53

數據庫數據庫優化

2010-12-10 10:17:21

關系型數據庫

2010-04-09 15:08:17

Oracle 數據庫性

2010-05-10 15:50:39

Oracle數據庫性能

2017-01-15 15:13:37

Android性能優化優化點

2015-09-10 09:24:58

2015-09-16 14:37:50

Android性能優化運算

2015-09-16 15:48:55

Android性能優化電量

2015-09-16 13:54:30

Android性能優化渲染

2011-03-24 12:32:15

數據庫性能優化
點贊
收藏

51CTO技術棧公眾號

五月激情久久| 国产高清av在线播放| 女人高潮被爽到呻吟在线观看| 亚洲色图.com| 看一级黄色录像| 亚洲欧洲一级| 91视频九色网站| 深爱激情久久| 欧美自拍视频在线| 一区二区三区免费在线看| 亚洲天堂av综合网| aaa在线播放视频| 日韩一区二区三| 国产高清视频在线| 日韩欧美在线网址 | 欧美三级午夜理伦三级小说| 国产一区二区三区日韩欧美| 欧美精品videosex| 精品国产在天天线2019| 丝袜美腿av在线| 精品奇米国产一区二区三区| 国产福利视频在线观看| 51午夜精品国产| 精品视频在线一区二区| 在线免费av一区| 成人影视在线播放| 91精品国产91综合久久蜜臀| 污视频在线免费观看网站| 91精选在线观看| 国产美女一区视频| 亚洲摸下面视频| 色婷婷成人网| 九九热精品在线| 秋霞蜜臀av久久电影网免费| 日韩美女av在线免费观看| 精品国产成人| 精品国产乱码久久久久久108| 国产一区二区三区成人欧美日韩在线观看 | 久久精品免费观看| 18视频在线观看娇喘| 不卡视频在线观看| 欧美伦理片在线观看| 亚洲精品免费在线观看| 瑟瑟在线观看| 亚洲精品一区二区三区四区高清| 乡村艳史在线观看| 久久免费在线观看| 综合在线视频| 中文字幕超清在线免费观看| 久久精品欧美一区二区三区麻豆| 亚洲欧美中文字幕在线观看| 在线一区二区视频| 爱看av在线| 午夜精品一区二区三区在线播放 | 亚洲性色视频| 欧美一区2区三区4区公司二百 | 一区二区三区资源| 二区三区在线播放| 亚洲视频在线观看| 国产乱码精品一区二区亚洲| 精品一区二区三区免费毛片| 国产91精品精华液一区二区三区 | 国产美女主播一区| 久久精品国产秦先生| 亚洲一区二区三区四区五区xx| 精品久久久久久久久国产字幕| 国产三区视频在线观看| 中文字幕久久亚洲| 四季av一区二区三区免费观看| 日韩色妇久久av| 亚洲精品欧美激情| 性爽视频在线| 国产精品日韩久久久久| 国产一区三区三区| 在线观看av每日更新免费| 日韩经典中文字幕| 色喇叭免费久久综合| 免费看污污视频| 亚洲成人中文在线| 99久久亚洲国产日韩美女 | 亚洲综合图色| 一道本在线观看视频| 亚洲妇女屁股眼交7| 婷婷综合六月| 国内精品久久国产| 一区二区中文视频| 中文字幕影音在线| 国产精品一区二区三区精品| 欧美激情一区在线| 色综合一本到久久亚洲91| 99九九视频| 亚洲精品一二三四区| 四虎4545www精品视频| 国新精品乱码一区二区三区18| 国产偷v国产偷v亚洲高清| 51xtv成人影院| 国产精品视频导航| 国产网站一区二区| 欧美色网在线| 日本成人三级电影网站| 午夜视黄欧洲亚洲| 秋霞影视一区二区三区| 国产伦精品一区二区三区四区视频_| 欧美精品国产精品| 亚洲精品va| 日本精品久久| 欧美老女人性视频| 久久精品九九| 九色视频在线观看免费播放| 欧美精品情趣视频| 国产成人啪免费观看软件| 午夜国产福利在线| 国产日韩欧美中文| 国产精品亲子乱子伦xxxx裸| 欧美另类老肥妇| 国产三区精品| 色哟哟精品一区| 波多野结衣在线一区二区| 狠狠爱在线视频一区| 国产一区一区| 996这里只有精品| 欧美精品久久99久久在免费线| 亚洲免费成人av在线| 国产av人人夜夜澡人人爽麻豆| 欧美一区永久视频免费观看| 欧美成人一品| 日本不卡视频一区二区| 国产精品aaaa| 亚洲欧美日韩小说| 欧美xxxx在线| 久草在线在线视频| 91av在线播放视频| 亚洲视频免费看| 久久99视频| 色播在线视频| 91传媒视频在线观看| 精品欧美aⅴ在线网站 | 黄页网站在线观看视频| 伊人久久久久久久久久久久久 | 久久国产手机看片| 欧美一区二视频| 看黄网站在线| 99精品国产一区二区| 亚洲精选在线视频| 天天躁日日躁成人字幕aⅴ| 久久精品99国产| 久热爱精品视频线路一| 久久只精品国产| 国产美女撒尿一区二区| 看黄色免费网站| 国产精品自拍网| 日本高清成人免费播放| 亚洲视屏一区| 国产精品探花在线| 亚洲精品蜜桃久久久久久| 日韩视频免费中文字幕| 国产日韩精品视频一区| 超碰97成人| 成人动漫av| 高清视频一区| 精品盗摄一区二区三区| 成人免费视频caoporn| 成人在线视频你懂的| а√天堂www在线а√天堂视频| 成人黄色免费片| 91精品国产综合久久久久久漫画| 日韩精品免费专区| 国产精品99久久久久久董美香| 国产成人精品视频ⅴa片软件竹菊| 91高清免费在线观看| 欧美体内谢she精2性欧美| 蘑菇福利视频一区播放| 不卡av影片| 免费高清成人| 国产精品视频一区二区三区经| 欧美精品一区二区精品网| 成人av免费网站| 欧美色网址大全| 男男gaygays亚洲| 天天天干夜夜夜操| 99久久国产免费免费| 亚洲电影免费观看高清完整版在线观看| 国产91精品免费| 欧美精品第一区| 3d玉蒲团在线观看| 男女视频网站在线观看| 国产精品女主播| 亚洲精品一区二区三区福利 | 羞羞网www| 国产一区在线观| 在线免费看av不卡| 色婷婷av一区二区| 成人黄色在线看| 欧美体内she精视频在线观看| 涩涩视频在线免费看| 人与动性xxxxx免费视频| 午夜精品一区二区三区四区 | 日韩高清在线| 毛片免费在线播放| 精品免费国产一区二区|