SQLite 和 Berkeley DB 的比較
一、記憶體資料庫:FastDB、BerkeleyDB、SQLite
記憶體資料庫, 顧名思義就是將資料放在記憶體中直接操作的資料庫。相對於磁碟,記憶體的資料讀寫速度要高出幾個數量級,將資料儲存在記憶體中相比從磁碟上訪問能夠極大地提高應用的效能。
最近要做一個專案,需要用到實時資料庫,PI太貴了,想找一個免費的,實在不行就只能自己編了。找了半天,找到了FastDB、BerkeleyDB和SQLite.
FastDB是記憶體型資料庫,據說很快,但資料庫大小不能大於實體記憶體,不然。。。反正我看到這就走了,我可是要一秒內處理幾千個資料,還要儲存8小時以上的啊!
BerkeleyDB和SQLite倒沒有資料庫大小不能大於實體記憶體的限制,我對他們的效能進行了測試,結果如下:
Berkeley DB | Sqlite | |
插入10000條記錄耗時 | 0.08秒 | 0.42秒 |
插入100000條記錄耗時 | 2.31秒 | 3.81秒 |
插入7200000條記錄耗時 | 1024.34秒 | 249秒 |
插入57600000條記錄耗時 | 12860.78秒 | 2155.14秒 |
插入172800000條記錄耗時 | 48039.64秒 | 6352.06 |
10000條記錄查1記錄耗時 | 少於0.01秒 | 少於0.01秒 |
100000條記錄查1記錄耗時 | 少於0.01秒 | 少於0.01秒 |
7200000條記錄查1記錄耗時 | 少於0.01秒 | 少於0.01秒 |
57600000條記錄查1記錄耗時 | 0.03秒 | 0.16秒 |
172800000條記錄查1記錄耗時 | 0.03秒 | 0.09秒 |
10000條記錄資料庫大小 | 0.628M | 0.527M |
100000條記錄資料庫大小 | 5.29M | 5.32M |
7200000條記錄資料庫大小 | 516M | 405M |
57600000條記錄資料庫大小 | 3087.13M | 3925.8M |
172800000條記錄資料庫大小 | 11890.7M | 10621.2M |
上表為兩種資料庫只建一個索引,Berkeley DB不支援事務、Sqlite支援事務情況下的資料,如果Berkeley DB開啟事務支援,速度會下降很大的數量級,根本不能滿足需求。另外在程式崩潰後Berkeley DB資料庫不可用,Sqlite資料庫仍可正常使用。
其實:Berkeley db不用一下子提交這麼多資料,可以將大資料量分步操作, 插入100000條記錄和插入10000條記錄 的區別是前者插入10000條記錄十次!這樣算下 更省時間!
Bdb併發性方面比sqlite強,所以商業上BDB用的比較多。Android和iOS手機系統中使用sqlite
總結:1、fastdb挺快,但可惜資料庫超過記憶體容量,插入和查詢速度就會慢下來;
2、 Bdb 在併發性方面比sqlite強很多;
3、 Bdb插入和查詢速度比 sqlite稍快
事務,批量插入
可以通過使用 BEGIN 命令手工開始一個事務。這種事務將會持續到下一個 COMMIT 或 ROLLBACK 命令為止。但如果資料庫關閉,或者發生錯誤並且 ROLLBACK 衝突解決演算法已指定的情況下,事務也會回滾。
BEGIN TRANSACTION
COMMIT TRANSACTION 或 ROLLBACK TRANSACTION
END TRANSACTION 是 COMMIT 的一個別名
事務可以延遲執行(deferred),立即執行(immediate)或排它執行(exclusive)。 預設的事務行為是延遲地。延遲意味著直到資料庫第一次被訪問之前不需要加鎖。
如此,對於一個延遲的事務,BEGIN命令什麼也不做。直到第一個讀或寫操作之前, 不需要加鎖。對資料庫的第一個讀操作會產生一個共享鎖(SHARED), 第一個寫操作會加一個保持鎖(RESERVED)。由於對鎖的需要是延遲的, 直到確實需要為止,在當前程序執行BEGIN之後, 有可能其它的程序或執行緒會啟動一個另外的事務並寫到資料庫。
如果事務是立即的,那麼,執行BEGIN命令將立即在所有資料庫上獲得一個RESERVED鎖, 而不用等待資料庫被訪問到。在BEGIN IMMEDIATE之後, 可以保證沒有其它程序下寫入資料庫中執行BEGIN IMMEDIATE或BEGIN EXCLUSIVE。 但其它程序仍可以從資料庫中讀資料。
一個排它的事務將在所有資料庫上獲得 EXCLUSIVE 鎖,在該事務結束之前,沒有任何其它執行緒或程序可以讀、寫資料庫。
三、嵌入式資料庫:SQLite,Berkeley DB,Firebird
嵌入式資料庫是指執行在本機上、不用啟動服務端的輕型資料庫,它與應用程式緊密整合,被應用程式所啟動,並伴隨應用程式的退出而終止。
從這個意義上講,似乎所有單機資料庫都可以算嵌入式資料庫,比如Access,Paradox,DBF等等,因為它們都不用啟動資料庫伺服器即可使用。然而,我們通常不將上述資料庫歸入嵌入式資料庫,而只將它們歸入“桌面資料庫”,甚至“檔案型資料庫”,因為這些資料庫的完備性、儲存容量及效能方面存在較大的缺陷。
嵌入式資料庫支援的資料都是TB檔案級別,更由於嵌入式資料庫具備高效能的特點,可以預測,單機資料庫的未來將是嵌入式資料庫的天下。
嵌入式資料庫三雄
目前,嵌入式資料庫市場主要由三個產品分割:SQLite,Berkeley DB,Firebird嵌入伺服器版,巧的是,這三個資料庫產品都是開源軟體。
SQLite 主頁:http://www.sqlite.org
SQLite誕生於2000年5月,這幾年增長勢頭迅猛無比,目前版本是3.3.8。
SQLite的特點如下:
1、無需安裝配置,應用程式只需攜帶一個動態連結庫。
2、非常小巧,For Windows 3.3.8版本的DLL檔案才374KB。
3、ACID事務支援,ACID即原子性、一致性、隔離性、和永續性(Atomic、Consistent、Isolated、和 Durable)。
4、資料庫檔案可以在不同位元組順序的機器間自由的共享,比如可以直接從Windows移植到Linux或MAC。
5、支援資料庫大小至2TB。
Berkeley DB 主頁:http://www.oracle.com/database/berkeley-db/index.html
Berkeley DB是由美國Sleepycat Software公司開發的一套開放原始碼的嵌入式資料庫的程式庫,它於1991年釋出,號稱“為應用程式開發者提供工業級強度的資料庫服務”,可謂是老牌悍將。Sleepycat現已被甲骨文(ORACLE)公司收購。
Berkeley DB的特點如下:
1、嵌入式,無需安裝配置。
2、為多種程式語言提供了API介面,其中包括C、C++、Java、Perl、Tcl、Python和PHP等等。
3、輕便靈活。它可以運行於幾乎所有的UNIX和Linux系統及其變種系統、Windows作業系統以及多種嵌入式實時作業系統之下。
4、可伸縮。它的Database library才幾百KB大小,但它能夠管理規模高達256TB的資料庫。它支援高併發度,成千上萬個使用者可同時操縱同一個資料庫。
Firebird 嵌入伺服器版(Embedded Server) 主頁:http://www.firebirdsql.org
從Interbase開源衍生出的Firebird,充滿了勃勃生機。雖然它的體積比前輩Interbase縮小了幾十倍,但功能並無閹割。為了體現Firebird短小精悍的特色,開發小組在增加了超級伺服器版本之後,又增加了嵌入版本,最新版本為2.0。
Firebird的嵌入版有如下特色:
1、資料庫檔案與Firebird網路版本完全相容,差別僅在於連線方式不同,可以實現零成本遷移。
2、資料庫檔案僅受作業系統的限制,且支援將一個數據庫分割成不同檔案,突破了作業系統最大檔案的限制,提高了IO吞吐量。
3、完全支援SQL92標準,支援大部分SQL-99標準功能。
4、豐富的開發工具支援,絕大部分基於Interbase的元件,可以直接使用於Firebird。
5、支援事務、儲存過程、觸發器等關係資料庫的所有特性。
6、可自己編寫擴充套件函式(UDF)。
嵌入式資料庫特性對比
產品名稱 SQLite Berkeley DB Firebird嵌入伺服器版
當前版本: 3.3.8、4.5.20、2.0
速度:最快、快、快
穩定性:好、好、好
資料庫容量:2TB、256TB、64TB
SQL支援:大部份SQL- 92、不支援、完全SQL-92與大部份SQL-99
Win32平臺下最小體積:374KB、840KB、3.68MB
資料操縱:SQL、僅應用程式介面、SQL
從以上對比中,我們可以看到,最短小精悍的是SQLite,它的效能也是最高的,Berkeley DB比較特殊,因為它不是用SQL語言來操縱資料的,Firebird嵌入版的體積對比之下顯得稍大了些,但它對關係資料庫特性的支援是最好的,如果要考慮到今後或許要將資料庫升級成網路版本,就要選Firebird了。