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 方法獲取管道,它可以實現一次性傳送多條命令並一次性返回結果,這樣就大量...