SQLite批量資料寫入優化方法

2021-06-25 09:36:24 字數 1766 閱讀 5956

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 inserts 

create 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 omitted 

insert 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.061 

sqlite 2.7.6 (nosync): 

0.223

測試2: 使用事務 25000 inserts 

begin; 

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 omitted 

insert 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.914 

sqlite 2.7.6 (nosync): 

0.757

可見使用了事務之後卻是極大的提高了資料庫的效率。但是我們也要注意,使用事務也是有一定的開銷的,所以對於資料量很小的操作可以不必使用,以免造成而外的消耗。

Sqlite大資料寫入效能優化

眾所周知,sqlite是乙個輕量級的資料庫,僅僅需要乙個exe檔案就能執行起來。在處理本地資料上,我比較喜歡選擇使用它,不僅是因為他與sql server有著比較相近的語法,還因為它不需要安裝,僅需要通過命令列就能啟動了,而且他在處理大資料時,效能比sql server好很多,好吧這裡不繼續爭論效能...

SQLite批量插入優化方法

sqlite的資料庫本質上來講就是乙個磁碟上的檔案,所以一切的資料庫操作其實都會轉化為對檔案的操作,而頻繁的檔案操作將會是乙個很好時的過程,會極大地影響資料庫訪問的速度。例如 向資料庫中插入100萬條資料,在預設的情況下如果僅僅是執行 sqlite3 exec db,insert into name...

Redis批量寫入資料

生產中的有些場景,我們經常需要大批量的往redis中寫入資料,如果我們採用單條迴圈寫入的話,不僅效率低下,而且可能會出現頻繁的建立和銷毀redis連線,這些都是很不合理的.對此,我們可以採用jedis的父類中的pipelined 方法獲取管道,它可以實現一次性傳送多條命令並一次性返回結果,這樣就大量...