Berkeley db 数据库

开发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年中期, Sleepycat软件公司成立,提供对DB的商业支持。在这以后,DB得到了广泛的应用,当前最新版本是4.7.25。

Berkeley DB的设计思想

       DB的设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API),调用本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。第一:DB库和应用程序运行在同一个地址空间,没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;第二:不需要对SQL代码解码,对数据的访问直截了当。

       DB对需要管理的数据看法很简单,DB数据库包含若干条记录,每一个记录由关键字和数据(KEY/VALUE)构成。数据可以是简单的数据类型,也可以是复杂的数据类型,例如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 在性能表现上就很重要了。 例如,因为在 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),即多条记录有相同关键字,在对多重记录的处理中,使用游标是最容易的方式。

     数据库环境句柄结构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)子系统采用的是先写日志的策略,用于支持事务子系统进行数据恢复,保证数据一致性。它不大可能被应用程序单独使用,只能作为事务子系统的调用模块。

      Berkeley db 数据库_第1张图片

 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连接,映射等操作,效率可能会差

参考:

http://blog.csdn.net/heiyeshuwu/article/details/907793
http://www.iteye.com/topic/202990
Berkeley DB参考手册
     

     

你可能感兴趣的:(Berkeley db 数据库)