比Redis更快:Berkeley DB面面觀
Redis很火,最近大家用的多。從兩年前開始,Memcached轉向Redis逐漸成為潮流;
而Berkeley DB可能很多朋友還很陌生,首先,我們簡單的介紹一下。
Berkeley DB介紹
- 歷史悠久。Berkeley DB1991年發行第一版, 2006年被Oracle收購;
- Berkeley DB是一個嵌入式數據庫系統,將其歸類到內存數據庫范疇沒有問題;
-
使用Key-Value結構存儲,本身不支持SQL,5.5版以后整合了SQLite,可使用sql進行查詢;官方資料給出的評估是如果原生的bdb能讓性能提升10倍,使用SqlLite之后,大概就只有2-3倍;sql的解析及底層的銜接耗時較多;
-
開源產品,使用的開源協議為: AFFERO GPL (AGPL)。這個協議對商用產品主要的約束是對與使用Berkeley DB的軟件,發布軟件包時需要付費;舉個例子:如果微軟的office要使用則必須付費;而騰訊的QQ后台服務器使用則無需付費;
Berkeley DB設計思想
簡單、小巧、可靠、高性能。
DB庫和應用運行在同一進程空間,接口為API形式,應用通過API存取DB;
應用范例
MySQL 5.1版之前的數據事務存儲引擎使用的是Berkeley DB;(5.1版之后不再使用更多的可能是出於商業的原因,因為Berkeley DB被Oracle收購了)
Google Accounts選用的Berkeley DB作為存儲引擎;
Berkeley DB VS Redis
除了速度,Berkeley DB的最大的優勢是支持多索引(次級索引);支持多索引,使得從關系型DB中移植到內存DB更容易,可有效避免數據膨脹及自行處理索引之間的映射關系;
eg:一張學生信息表,以學號為主鍵(唯一性索引)建立了索引可以查詢到指定的學生記錄;如果再希望以姓名來查詢,可以以姓名為鍵建立次級索引來查詢;
在查詢條件比較復雜的情況下,可組合建立多個次級索引來找到同一份數據;
想進一步了解次級索引如何使用,可參考這篇文章:《Berkeley DB多索引查詢》
性能測試對比:Berkeley DB VS Redis
使用環境:
CPU:Intel Core 2 Duo P9xxx 2.0G
MEM:16G
OS:Red Hat Enterprise Linux Server release 6.3 (Santiago) x86_64
同樣是內存數據庫,我們對比Berkeley DB和Redis的運行時間(單位:ms)
A表記錄:506622條記錄:每條記錄:96個字節
B表記錄:2478條記錄;每條記錄:10個字節;
C表記錄:107221條記錄;每條記錄:82個字節;
重建內存數據庫 BDB用4s,Redis 20s;
更新內存數據庫,BDB和Redis的實驗結果都比較理想
查詢記錄時,BDB比Redis基本快一個數量級;
緩存、重建整個表操作,BDB性能明顯優於Redis;這是因為BDB提供批量讀取所有數據的接口,而Redis沒有提供類似的接口;
性能對比測試:Berkeley DB VS Oracle
為了將數據從Oracle中移植出來,我們需要對比關系型數據庫和Berkeley DB的查詢效率:
首先,我們使用唯一性索引作為Berkeley DB的主鍵,並因此查詢來和oracle對比;
數據規模:
實驗數據;1112516條記錄:
大小2.8G;
以查詢出最終結果為准:
SQL查詢:
SELECT * FROM table_a
WHERE (DATE=to_date(:v, 'YYYYMMDD') AND A =:a AND B =:b AND c>=:c AND D>=:d) AND ( E=:e) AND (F=:F) AND (G=:g) AND H!='C' AND N='N'";
其中>= 、 !=操作無法編入索引,在索引查處數據后需應用再進行篩選過濾;
最終的查詢結果為一條記錄;
如果這篇文章讓你對Berkeley DB產生了興趣,如果你也想着效率那點事,想着將關系數據庫轉到nosql,試着上手吧。傳送門:《Berkeley DB入門篇》。
Posted by: 大CC | 31OCT,2013
博客:blog.me115.com
微博:新浪微博