SQLite 性能優化實例分享_SQLite

來源:腳本之家  責任編輯:小易  

SQLite的數據庫本質上來講就是一個磁盤上的文件,所以一切的數據庫操作其實都會轉化為對文件的操作,而頻繁的文件操作將會是一個很好時的過程,會極大地影響數據庫存取的速度。例如:向數據庫中插入100萬條數據,在默認的情況下如果僅僅是執行sqlite3_exec(db,“insert into name values‘lxkxf',‘24';0,0,&zErrMsg);將會重復的打開關閉數據庫文件100萬次,所以速度當然會很慢。因此對于這種情況我們應該使用“事務”。具體方法如下:在執行SQL語句之前和SQL語句執行完畢之后加上rc=sqlite3_exec(db,"BEGIN;0,0,&zErrMsg);執行SQL語句rc=sqlite3_exec(db,"COMMIT;0,0,&zErrMsg);這樣SQLite將把全部要執行的SQL語句先緩存在內存當中,然后等到COMMIT的時候一次性的寫入數據庫,這樣數據庫文件只被打開關閉了一次,效率自然大大的提高。有一組數據對比:測試1:1000 INSERTsCREATE TABLE t1(a INTEGER,b INTEGER,c VARCHAR(100));INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');995 lines omittedINSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');SQLite 2.7.6:13.061SQLite 2.7.6(nosync):0.223測試2:使用事務 25000 INSERTsBEGIN;CREATE TABLE t2(a INTEGER,b INTEGER,c VARCHAR(100));INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two');24997 lines omittedINSERT INTO t2 VALUES(24999,89569,'eighty nine thousand five hundred sixty nine');INSERT INTO t2 VALUES(25000,94666,'ninety four thousand six hundred sixty six');COMMIT;SQLite 2.7.6:0.914SQLite 2.7.6(nosync):0.757www.anxorj.tw防采集請勿采集本網。

最早接觸 iOS 開發了解到的第一個緩存數據庫就是 SQLite,后面一直也以 SQLite 作為中堅力量使用,以前沒有接觸到比較大量數據的讀寫,所以在性能優化方面關注不多,這次對一個特定場景的較多數據批量讀寫做了一個性能優化,使性能提高了十倍。

本文主要討論在Android應用如何優化SQLite的性能和資源占用。1,使用事務(Transaction)在默認情況下每一個SQL語句都被包一個全新的事務內,比如執行一個如INSERT這樣基本的數據庫操作,就會放到一個新創建

大致應用場景是這樣:

可以再增加一列name_tmp,存儲name的反串,比如存儲的是 cbaxxxx值,跟name字段反著,然后在name_tmp字段建立索引,這樣查詢的時候可以使用select*from tablename where name_tmp like 'abc%';

每次程序啟動會從服務器拉取一些數據,對本地數據庫兩個表進行同步更新,不存在就寫入,存在就更新其字段。數據少的時候幾十條,多的上千條。

在數據庫的sql語句前加:\"begin;result=sqlite3_exec(_db,sql.c_str(),nullptr,nullptr,&errMsg);if(result!SQLITE_OK){ log(\"insert error,code=d,message=s\\n\",result,errMsg);} }

由于緩存的數據可能會存在異步同時讀寫,所以做了一個后臺同步隊列,所有的緩存數據庫操作都在這個隊列里面,然后我監控了一下寫數據庫的關鍵代碼執行耗時,一千條數據更新到數據庫就能耗時 30 秒之久,磁盤寫入在 1.5M/s 浮動, 雖然沒有卡主線程,這個消耗即使在后臺也是不可容忍的。

使用事務,使用SQLiteDatabase的beginTransaction()方法可以開啟一個事務,程序執行到endTransaction()方法時會檢查事務的標志是否為成功,如果為成功則提交事務,否則回滾事務。當應用需要提交事務,必須

核心的數據庫操作大概是這樣的

like 是模糊查詢,通配符%表示任意字符,like‘%5400%’這個條件要進行全表掃描,而 YY_BH LIKE’X5400%’只需要索引出開頭為X5400就可以,效率當然就可以提高了

for 1000 : {Select -> Update Or InsertSelect -> Update Or Insert}

由于牽涉到兩張表,所以會有兩次,經過測試,Select 一次幾乎沒有多少消息,可是 Update 或者 Insert ( [FMDatabaseQueue executeUpdate:] ) 就消耗大了,因為會寫入磁盤,然后想到是不是可以把所有的 SQL 語句拼接起來,最后只想一次;再后來想到 SQLite 不是有事務 ( Transaction ) 嘛,于是嘗試了一下利用 FMDB 的事務操作,在循環開始前 [db beginTransaction] ,循環結束 [db commit],包起來就行了。

增加事務之后的大概邏輯:

beginTransactionfor 1000 : {Select -> Update Or InsertSelect -> Update Or Insert}commit

測試效果非常好,整個耗時從 30 秒下降到了2.8 秒左右,僅僅增加了兩行代碼。

總結:

踩過的坑,走過的坎,都是以后的經驗

雖然利用事務取巧來提高了性能,但是這樣做其實并不安全,好在所屬場景對這部分數據絕對一致要求不是太高。

模擬器和真機有時候測試并不能重現同一個問題,因為所屬架構、CPU、硬盤都不一樣,所以性能測試最好還是以真機為準。該問題測試的時候在模擬器上很多問題都沒有,因為硬盤比真機讀寫速度要高,所以避免了很多問題,測試的時候也就沒有發現。

數據庫設計設計的時候得多考慮考慮,多想想以后怎么擴展,怎么升級,讀寫的時候性能怎么樣

第1條語句,跟create_time索引沒關系第2條語句,應該不會使用create_time索引,因為即便用了索引最后還是要讀表數據,還不如直接全表讀數據然后在內存中排序快第3條語句,不知道0到1383525367的create_time選出的記錄數相對于全表記錄數的比率有多大,太多了應該也不會使用索引,因為最后還是要讀一遍表數據,如果比率比較小應該會用上索引內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • sqlite優化方法
  • android創建數據庫(sqlite)保存圖片示例
  • sqlite3中的日期時間函數使用小結
  • sqlite3中自增主鍵相關知識總結
  • c#操作sqlite方法實例詳解
  • python之sqlalchemy創建表的實例詳解
  • sqlite 內存數據庫學習手冊
  • sqlite學習手冊(sqlite在線備份)
  • 基于sqlite特殊字符轉義的實現方法
  • 保護你的sqlite數據庫(sqlite數據庫安全秘籍)
  • 初識sqlite3數據庫
  • sqlite教程(三):數據表和視圖簡介
  • sqlite教程(十三):c語言編程實例代碼(1)
  • sqlite時間戳轉時間語句(時間轉時間戳)
  • sqlite3 api 編程手冊
  • 求sqlite數據庫索引創建語句或性能優化方案
  • sqlite如何優化
  • sqlite大數據庫怎樣進行性能優化
  • 如何優化sqlite的查詢速度
  • 如何優化SQLite-Android開發實例
  • 請教一個SQLITE like語句優化問題
  • 如果使用sqlite,大批量的插入數據,需要做哪些優化
  • 如何提升SQLite的性能
  • 請教一個SQLITE like語句優化問題
  • 如何創建sqlite數據庫
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess數據庫文摘數據庫其它首頁sqlitesqlite優化方法android創建數據庫(sqlite)保存圖片示例sqlite3中的日期時間函數使用小結sqlite3中自增主鍵相關知識總結c#操作sqlite方法實例詳解python之sqlalchemy創建表的實例詳解sqlite 內存數據庫學習手冊sqlite學習手冊(sqlite在線備份)基于sqlite特殊字符轉義的實現方法保護你的sqlite數據庫(sqlite數據庫安全秘籍)初識sqlite3數據庫sqlite教程(三):數據表和視圖簡介sqlite教程(十三):c語言編程實例代碼(1)sqlite時間戳轉時間語句(時間轉時間戳)sqlite3 api 編程手冊sqlite中文亂碼問題原因分析及解sqlite3中的日期時間函數使用小結sqlite3 top的查詢及limit語法介linux sqlite3 基本命令sqlite 錯誤碼整理sqlite3中自增主鍵相關知識總結sqlite優化方法sqlite循環批量插入數據采用批處sqlite3 使用總結sqlite 常用函數 推薦sqlite 性能優化實例分享sqlite教程(五):數據庫和事務sqlite 入門教程二 sqlite的創建、修改、sqlite字符串比較時的大小寫問題解決方法sqlite優化方法sqlite循環批量插入數據采用批處理文件實初識sqlite3數據庫sqlite教程(五):索引和數據分析/清理sqlite學習手冊(sqlite在線備份)sqlite 入門教程四 增刪改查 有講究
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.anxorj.tw All Rights Reserved
    陕西快乐10分下载