近期要使用DBD,因而搜了下相關的資料,先貼個科普性的吧:html
轉自http://www.javaeye.com/topic/202990java
DB綜述
DB最初開發的目的是以新的HASH訪問算法來取代舊的hsearch函數和大量的dbm實現(如AT&T的dbm,Berkeley的ndbm,GNU項目的gdbm),DB的第一個發行版在1991年出現,當時還包括了B+樹數據訪問算法。在1992年,BSD UNIX第4.4發行版中包括了DB1.85版。基本上以爲這是DB的第一個正式版。在1996年中期,Sleepycat軟件公司成立,提供對DB的商業支持。在這之後,DB獲得了普遍的應用,當前最新版本號是4.3.27。linux
DB支持差點兒所有的現代操做系統,如LINUX、UNIX、WINDOWS等,也提供了豐富的應用程序接口,支持C、C++、JAVA、PERL、TCL、PYTHON、PHP等。DB的應用十分普遍,在很是多知名的軟件中都能看到其身影。好比參考資料2中做者談到利用DB在LINUX下實現內核級文件系統;參考資料3中經過實際測試數聽說明DB提升了OPENLDAP的效率。LINUX下的軟件包管理器RPM也使用DB管理軟件包相關數據,可以使用命令file查看RPM數據文件夾/var/lib/rpm下的文件,則有形式例如如下的輸出:算法
Dirnames: Berkeley DB (Btree, version 9, native byte-order)
Filemd5s: Berkeley DB (Hash, version 8, native byte-order)數據庫
值得注意的是DB是嵌入式數據庫系統,而不是常見的關係/對象型數據庫,對SQL語言不支持,也不提供數據庫常見的高級功能,如存儲過程,觸發器等。編程
DB的設計思想
DB的設計思想是簡單、小巧、可靠、高性能。假設說一些主流數據庫系統是大而全的話,那麼DB就可稱爲小而精。DB提供了一系列應用程序接口(API),調用自己很是easy,應用程序和DB所提供的庫在一塊兒編譯成爲可執行程序。這樣的方式從雙方面極大提升了DB的效率。第一:DB庫和應用程序執行在同一個地址空間,沒有client程序和數據庫server之間昂貴的網絡通信開銷,也沒有本地主機進程之間的通信;第二:不需要對SQL代碼解碼,對數據的訪問直截了當。網絡
DB對需要管理的數據見解很是easy,DB數據庫包括若干條記錄,每一個記錄由keyword和數據(KEY/VALUE)構成。數據可以是簡單的數據類型,也可以是複雜的數據類型,好比C語言中結構。DB對數據類型不作不論什麼解釋, 全然由程序猿自行處理,典型的C語言指針的"自由"風格。假設把記錄當作一個有n個字段的表,那麼第1個字段爲表的主鍵,第2--n個字段相應了其餘數據。DB應用程序一般使用多個DB數據庫,從某種意義上看,也就是關係數據庫中的多個表。DB庫很是緊湊,不超過500K,但可以管理大至256T的數據量。數據結構
DB的設計充分體現了UNIX的基於工具的哲學,即若干簡單工具的組合可以實現強大的功能。DB的每一個基礎功能模塊都被設計爲獨立的,也即意味着其使用領域並不侷限於DB自己。好比加鎖子系統可以用於非DB應用程序的通用操做,內存共享緩衝池子系統可以用於在內存中基於頁面的文件緩衝。併發
DB核心數據結構
數據庫句柄結構DB:包括了若干描寫敘述數據庫屬性的參數,如數據庫訪問方法類型、邏輯頁面大小、數據庫名稱等;同一時候,DB結構中包括了大量的數據庫處理函數指針,大多數形式爲 (*dosomething)(DB *, arg1, arg2, …)。當中最重要的有open,close,put,get等函數。函數
數據庫記錄結構DBT:DB中的記錄由keyword和數據構成,keyword和數據都用結構DBT表示。實際上全然可以把keyword當作特殊的數據。結構中最重要的兩個字段是 void * data和u_int32_t size,分別相應數據自己和數據的長度。
數據庫遊標結構DBC:遊標(cursor)是數據庫應用中常見概念,其本質上就是一個關於特定記錄的遍歷器。注意到DB支持多重記錄(duplicate records),即多條記錄有一樣keyword,在對多重記錄的處理中,使用遊標是最easy的方式。
數據庫環境句柄結構DB_ENV:環境在DB中屬於高級特性,本質上看,環境是多個數據庫的包裝器。當一個或多個數據庫在環境中打開後,環境可以爲這些數據庫提供多種子系統服務,好比多線/進程處理支持、事務處理支持、高性能支持、日誌恢復支持等。
DB中核心數據結構在使用前都要初始化,隨後可以調用結構中的函數(指針)完畢各類操做,最後必須關閉數據結構。從設計思想的層面上看,這樣的設計方法是利用面向過程語言實現面對對象編程的一個典範。
DB數據訪問算法
在數據庫領域中,數據訪問算法相應了數據在硬盤上的存儲格式和操做方法。在編寫應用程序時,選擇合適的算法可能會在運算速度上提升1個甚至多個數量級。大多數數據庫都選用B+樹算法,DB也不例外,同一時候還支持HASH算法、Recno算法和Queue算法。接下來,咱們將討論這些算法的特色以及怎樣依據需要存儲數據的特色進行選擇。
B+樹算法:B+樹是一個平衡樹,keyword有序存儲,並且其結構能隨數據的插入和刪除進行動態調整。爲了代碼的簡單,DB沒有實現對keyword的前綴碼壓縮。B+樹支持對數據查詢、插入、刪除的常數級速度。keyword可以爲隨意的數據結構。
HASH算法:DB中實際使用的是擴展線性HASH算法(extended linear hashing),可以依據HASH表的增加進行適當的調整。keyword可以爲隨意的數據結構。
Recno算法: 要求每一個記錄都有一個邏輯紀錄號,邏輯紀錄號由算法自己生成。實際上,這和關係型數據庫中邏輯主鍵一般定義爲int AUTO型是同一個概念。Recho創建在B+樹算法之上,提供了一個存儲有序數據的接口。記錄的長度可以爲定長或不定長。
Queue算法:和Recno方式接近, 僅僅只是記錄的長度爲定長。數據以定長記錄方式存儲在隊列中,插入操做把記錄插入到隊列的尾部,相比之下插入速度是最快的。
對算法的選擇首先要看keyword的類型,假設爲複雜類型,則僅僅能選擇B+樹或HASH算法,假設keyword爲邏輯記錄號,則應該選擇Recno或Queue算法。當工做集keyword有序時,B+樹算法比較合適;假設工做集比較大且基本上keyword爲隨機分佈時,選擇HASH算法。Queue算法僅僅能存儲定長的記錄,在高的併發處理狀況下,Queue算法效率較高;假設是其餘狀況,則選擇Recno算法,Recno算法把數據存儲爲平面文件格式。