Berkeleydb数据库
开发Berkeley DB原因:
DB最初开发的⽬的是以新的HASH访问算法来代替旧的hsearch函数和⼤量的dbm实现(如AT&T的dbm,Berkeley的ndbm,GNU项⽬的gdbm),DB 的第⼀个发⾏版在1991年出现,当时还包含了B+树数据访问算法。在1992年,BSD UNIX第4.4发⾏版中包含了DB1.85版。基本上认为这是DB的第⼀个正式版。在1996年中期,软件公司成⽴,提供对DB的商业⽀持。在这以后,DB得到了⼴泛的应⽤,当前最新版本是4.7.25。
Berkeley DB的设计思想
DB的设计思想是简单、⼩巧、可靠、⾼性能。如果说⼀些主流数据库系统是⼤⽽全的话,那么DB就可称为⼩⽽精。DB提供了⼀系列应⽤程序接⼝(API),调⽤本⾝很简单,应⽤程序和DB所提供的库在⼀起编译成为可执⾏程序。这种⽅式从两⽅⾯极⼤提⾼了DB的效率。第⼀:DB库和应⽤程序运⾏在同⼀个地址空间,没有客户端程序和数据库服务器之间昂贵的⽹络通讯开销,也没有本地主机进程之间的通讯;第⼆:不需要对SQL代码解码,对数据的访问直截了当。
DB对需要管理的数据看法很简单,DB数据库包含若⼲条记录,每⼀个记录由关键字和数据(KEY/VA
LUE)构成。数据可以是简单的数据类型,也可以是复杂的数据类型,例如C语⾔中结构。DB对数据类型不做任何解释, 完全由程序员⾃⾏处理,典型的C语⾔指针的"⾃由"风格。如果把记录看成⼀个有n个字段的表,那么第1个字段为表的主键,第2--n个字段对应了其它数据。DB应⽤程序通常使⽤多个DB数据库,从某种意义上看,也就是关系数据库中的多个表。DB库⾮常紧凑,不超过500K,但可以管理⼤⾄256T的数据量。
DB的设计充分体现了UNIX的基于⼯具的哲学,即若⼲简单⼯具的组合可以实现强⼤的功能。DB的每⼀个基础功能模块都被设计为独⽴的,也即意味着其使⽤领域并不局限于DB本⾝。例如加锁⼦系统可以⽤于⾮DB应⽤程序的通⽤操作,内存共享缓冲池⼦系统可以⽤于在内存中基于页⾯的⽂件缓冲。
Berkeley DB数据访问算法
数据访问算法对应了数据在硬盘上的存储格式和操作⽅法。在编写应⽤程序时,选择合适的算法可能会在运算速度上提⾼1个甚⾄多个数量级。⼤多数数据库都选⽤B+树算法,DB也不例外,同时还⽀持HASH算法、Recno算法和Queue算法。接下来,我们将讨论这些算法的特点以及如何根据需要存储数据的特点进⾏选择。
B+树算法
B+树是⼀个平衡树,关键字有序存储,并且其结构能随数据的插⼊和删除进⾏动态调整。为了代码的简单,DB没有实现对关键字的前缀码压缩。B+树⽀持对数据查询、插⼊、删除的常数级速度。关键字可以为任意的数据结构。
HASH算法
DB中实际使⽤的是扩展线性HASH算法(extended linear hashing),可以根据HASH表的增长进⾏适当的调整。关键字可以为任意的数据结构。要求每⼀个记录都有⼀个逻辑纪录号,逻辑纪录号由算法本⾝⽣成。实际上,这和关系数据库中逻辑主键通常定义为int AUTO型是同⼀个概念。
Recno算法:
要求每⼀个记录都有⼀个逻辑纪录号,逻辑纪录号由算法本⾝⽣成。实际上,这和关系型数据库中逻辑主键通常定义为int AUTO型是同⼀个概念。
Recho建⽴在B+树算法之上,提供了⼀个存储有序数据的接⼝。记录的长度可以为定长或不定长。
Queue算法:
和Recno⽅式接近, 只不过记录的长度为定长。数据以定长记录⽅式存储在队列中,插⼊操作把记录插⼊到队列的尾部,相⽐之下插⼊速度是最快的。
四种访问算法的⽐较
对算法的选择⾸先要看关键字的类型,如果为复杂类型,则只能选择B+树或HASH算法,如果关键字为逻辑记录号,则应该选择Recno或Queue算法。当⼯作集关键字有序时,B+树算法⽐较合适;如果⼯作集⽐较⼤且基本上关键字为随机分布时,选择HASH算法。Queue算法只能存储定长的记录,在⾼的并发处理情况下,Queue算法效率较⾼;如果是其它情况,则选择
Recno算法,Recno算法把数据存储为平⾯⽂件格式。
深⼊对B+树与hash⽐较
1:在⼩的数据设置上,Hash和Btree在性能表现上没什么差别。在那⼉,所有的,或⼤部分数据设置被放在了cache⾥⾯。
2:尽管如此,当⼀个⼀数据设置⾜够⼤的时候,会有⼀些重要的数据页再也装不进cache⾥了。这种情况下,我们上⾯讨论的btree在性能表现上就很重要了。例如,因
2:尽管如此,当⼀个⼀数据设置⾜够⼤的时候,会有⼀些重要的数据页再也装不进cache⾥了。这种情况下,我们上⾯讨论的btree在性能表现上就很重要了。例如,因为在hash中没有排列顺序中附近的机制。所以,cache在Btree中通常⽐Hash中更有效。Btree⽅法将产⽣更少的I/O调⽤。
3:尽管如此,当⼀个数据设置更⼤的时候,hash访问⽅法能赢过btree⽅法。原因是btree⽐hash数据库包含了更多的元数据页。数据设置可以变的⾮常⼤,以⾄于元数据开始⽀配整个cache。如果这种事情发⽣,Btree将不得不对每次请求都进⾏⼀次I/O操作。Cache中⼏乎没有地⽅再放置那些真正的数据页了,失去了cache的意义。⽽因为hash有很少的元数据,可以它的cache照样可以⽤来放置那些数据页,起到cahche的作⽤。
4:当⼀个数据更更⼤的时候,以⾄于每个随机请求,hash和btree⼏乎都要进⾏⼀次I/O操作的时候。在这种情况下,实际上hash只要遍历少树⼏个内部页(internal pages)就差不多能到,所以这也是hash在性能上的⼀个优势。应⽤程序对数据的访问式样也极⼤的影响这些⾏为。例如,延着光标往下遍历的话,每次I/O操作到cache中的数据,将满⾜接下来的很多数据请求。
5:如果数据设置只是⽐cache⼤⼀点,我们还是条件使⽤Btree,如果你实在有太⼤的数据设置,hash也许会更好⼀些。db_stat公⽤程序是⼀个有⽤的⼯具,⽤来监视,你的cache表现的怎么样。
以上具体数据量⼤⼩,我没有到相关数据
总结:
其实到这你应该能看出来,btree是在数据不是很⼤的时候是很优秀的,在更⼤的时候,由于元数据占
⽤太多cache的原因,导致性能下降,落后与hash了,⽽不是说hash能超过它。所以能在元数据占⽤cache不是太多以前,也就是你的cache⾜够⼤,使⽤btree只最好的选择。当然,如果每次访问的数据都是随机的没有什么次序,也不是near的,那⽤btree也没什么优势了。
Berkeley DB核⼼数据结构
数据库句柄结构DB:
包含了若⼲描述数据库属性的参数,如数据库访问⽅法类型、逻辑页⾯⼤⼩、数据库名称等;同时,DB结构中包含了⼤量的数据库处理函数指针,⼤多数形式为(*dosomething)(DB *, arg1, arg2, …)。其中最重要的有open,close,put,get等函数。
数据库记录结构DBT:
DB中的记录由关键字和数据构成,关键字和数据都⽤结构DBT表⽰。实际上完全可以把关键字看成特殊的数据。结构中最重要的两个字段是 void * data和u_int32_t size,分别对应数据本⾝和数据的长度。
数据库游标结构DBC:
游标(cursor)是数据库应⽤中常见概念,其本质上就是⼀个关于特定记录的遍历器。注意到DB⽀持多重记录(duplicate records),即多条记录有相同关键字,在对多重记录的处理中,使⽤游标是最容易的⽅式。sql语句实现的四种功能
数据库环境句柄结构DB_ENV:
环境在DB中属于⾼级特性,本质上看,环境是多个数据库的包装器。当⼀个或多个数据库在环境中打开后,环境可以为这些数据库提供多种⼦系统服务,例如多线/进程处理⽀持、事务处理⽀持、⾼性能⽀持、⽇志恢复⽀持等。
DB中核⼼数据结构在使⽤前都要初始化,随后可以调⽤结构中的函数(指针)完成各种操作,最后必须关闭数据结构。从设计思想的层⾯上看,这种设计⽅法是利⽤⾯向过程语⾔实现⾯对对象编程的⼀个典范。
Berkeley DB系统结构
Berkeley DB由五个主要的⼦系统构成.包括: 存取管理⼦系统、内存池管理⼦系统、事务⼦系统、锁⼦系统以和⽇志⼦系统。其中存取管理⼦系统作为Berkeley DB数据库进程包内部核⼼组件,⽽其他⼦系统都存在于Berkeley DB数据库进程包的外部。
每个⼦系统⽀持不同的应⽤级别。
1.数据存取⼦系统
数据存取(Access Methods)⼦系统为创建和访问数据库⽂件提供了多种⽀持。Berkeley DB提供了以下四种⽂件存储⽅法:
哈希⽂件、B树、定长记录(队列)和变长记录(基于记录号的简单存储⽅式),应⽤程序可以从中选择最适合的⽂件组织结构。程序员创建表时可以使⽤任意⼀种结构,并且可以在同⼀个应⽤程序中对不同存储类型的⽂件进⾏混合操作。
在没有事务管理的情况下,该⼦系统中的模块可单独使⽤,为应⽤程序提供快速⾼效的数据存取服务。
数据存取⼦系统适⽤于不需事务只需快速格式⽂件访问的应⽤。
2.内存池管理⼦系统
内存池(Memory pool)⼦系统对Berkeley DB所使⽤的共享缓冲区进⾏有效的管理。它允许同时访问数据库的多个进程或者进程的多个线程共享⼀个⾼速缓存,负责将修改后的页写回⽂件和为新调⼊的页分配内存空间。
它也可以独⽴于Berkeley DB系统之外,单独被应⽤程序使⽤,为其⾃⼰的⽂件和页分配内存空间。
内存池管理⼦系统适⽤于需要灵活的、⾯向页的、缓冲的共享⽂件访问的应⽤。
3.事务⼦系统
事务(Transaction)⼦系统为Berkeley DB提供事务管理功能。它允许把⼀组对数据库的修改看作⼀个原⼦单位,这组操作要么全做,要么全不做。在默认的情况下,系统将提供严格的ACID(原⼦性,⼀致性,隔离性,持久性)事务属性,但是应⽤程序可以选择不使⽤系统所作的隔离保证。该⼦系统使⽤两段锁技术和先写⽇志策略来保证数据库数据的正确性和⼀致性。它也可以被应⽤程序单独使⽤来对其⾃⾝的数据更新进⾏事务保护。事务⼦系统适⽤于需要事务保证数据的修改的应⽤。
4.锁⼦系统
锁(Locking)⼦系统为Berkeley DB提供锁机制,为系统提供多⽤户读取和单⽤户修改同⼀对象的共享控制。数据存取⼦系统可利⽤该⼦系统获得对页或记录的读写权限;事务⼦系统利⽤锁机制来实现多个事务的并发控制;该⼦系统也可被应⽤程序单独采⽤。锁⼦系统适⽤于⼀个灵活的、快速的、可设置的锁管理器。
5.⽇志⼦系统
⽇志(Logging)⼦系统采⽤的是先写⽇志的策略,⽤于⽀持事务⼦系统进⾏数据恢复,保证数据⼀致性。它不⼤可能被应⽤程序单独使⽤,只能作为事务⼦系统的调⽤模块。
BerkeleyDB存储功能概述
Berkeley DB所管理数据的逻辑组织单位是若⼲个独⽴或有⼀定关系的数据库(database),每个数据库由若⼲记录组成,这些记录全都被表⽰成
(key,value)的形式.
在物理组织上,每⼀个数据库在创建的时候可以由应⽤程序根据其数据特点来选择⼀种合适的存储结构。可供选择的四种⽂件存储结构分别是:哈希⽂件、B树、定长记录(队列)和变长记录(基于记录号的简单存储⽅式)。
⼀个物理的⽂件中可以只存放⼀个单独的数据库,也可以存放若⼲相关或不相关的数据库,⽽且这些数据库可以分别采⽤除队列之外任意不同的组织⽅式,以队列组织的数据库只能单独存放于⼀个⽂件,不能同其他存储类型混合存放。
⼀个⽂件除了受最⼤⽂件长度和存储空间的约束之外(为什么受最⼤⽂件长度约束?),理论上可以存储任意多个数据库。因此系统定位⼀个数据库通常需要两个参数——“⽂件名”和“数据库名”,这也是Berkeley DB不同于⼀般关系数据库的地⽅。
Berkeley DB存储系统为应⽤程序提供了⼀系列的接⼝函数,⽤于对数据库的管理和操作。其中包括:
(1)数据库的创建、打开、关闭、删除、重命名等,以及对数据的检索和增删改操作;
(2)提供⼀些附加的功能,例如读取数据库状态信息、读取所在⽂件的信息、读取所在数据库环境的信息、清空数据库的内容、数据库的同步备份、版本升级、提⽰出错信息等等;
(3)系统还提供了游标机制,⽤于存取和访问成组的数据,以及对两个或多个相关数据库进⾏关联和等值连接操作;
(4)系统还给出了⼀些接⼝函数⽤于对存取策略进⾏优化配置,⽐如应⽤程序可以⾃⼰设置B树的排序⽐较函数、每页中存放key的最少数⽬,哈希桶的填充因⼦、哈希函数、哈希表最⼤长度,队列的最⼤长度,数据库存放的字节顺序,底层存储页的⼤⼩,内存分配函数,⾼速缓存的⼤⼩,定长记录的⼤⼩和填充
位,变长记录所⽤的分隔符等等。
总结⼀些Berkeley DB特点:
1、开源的⽂件数据库,介于关系数据库与内存数据库之间,使⽤⽅式与内存数据库类似,它提供的是⼀系列直接访问数据库的函数
2、Berkeley DB可以保存任意类型的键/值对,⽽且可以为⼀个键保存多个数据,但是只⽀持键值对这⼀种数据结构
3、DB是系统,⽽不是常见的关系/对象型数据库,对SQL语⾔不⽀持,也不提供数据库常见的⾼级功能,如,等。
4、相⽐SQL Server等数据库,Berkeley DB架构简单,却⽀持很多⾼级的数据库特性,⽐如ACID 数据库事务处理,细粒度锁,XA接⼝,热备份以及同步复制。
5、访问速度快,省硬盘空间
6、Berkeley DB XML,是⼀个接⼝,通过它可以实现对XML数据存贮的⽀持。对XML数据的访问,会使⽤相应的查询语句如Xquery, Xpath。
应⽤领域
Berkeley DB是⼀种在特定的数据管理应⽤程序中⼴泛使⽤的数据库系统,在世界范围内有超过两亿的⽤户⽀持.许多世界知名的⼚商,像Amazon, AOL, British Telecom, Cisco Systems, EMC, Ericsson, Google, Hitachi, HP, Motorola, RSA Security, Sun Microsystems, TIBCO 以及 Veritas都依赖于BDB为他们的许多关键性应⽤提供快速的,弹性的,可靠的,并且⾼性价⽐的数据管理.
下⾯先简要说说BDB与其它⼏种数据库的区别:
(1)它们⼏乎都⽆⼀例外的采⽤了结构化查询语⾔(SQL),⽽BDB没有。
(2)它们⼏乎都⽆⼀例外的采⽤了客户/服务器模型,⽽BDB采⽤的是嵌⼊式模型。
Berkeley DB在嵌⼊式应⽤中⽐关系数据库和⾯向对象数据库要好,有以下两点原因:
(1)因为数据库程序库同应⽤程序在相同的地址空间中运⾏,所以数据库操作不需要进程间的通讯。在⼀台机器的不同进程间或在⽹络中不同机器间进⾏进程通讯所花费的开销,要远远⼤于函数调⽤的开销;
(2)因为Berkeley DB对所有操作都使⽤⼀组API接⼝,因此不需要对某种查询语⾔进⾏解析,也不⽤⽣成执⾏计划,⼤⼤提⾼了运⾏效.
Berkeley DB缺点:
个⼈观点:只能进⾏简单的键值对查询,对于SQL中较复杂的查询,由于缺乏像RDBMS连接,映射等操作,效率可能会差
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论