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

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
