B树概念

简介

    B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减小IO操做大量被应用。遗憾的是,他们并无说明为何取名为B树,但按照B树的性质来讲B一般被解释为Balance。在国内一般有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。html

    一个典型的 B树如图1所示。数据库

    

    图1.一个典型的B树缓存

 

    符合以下特征的树才能够称为B树:服务器

  •     根节点若是不是叶节点,则至少须要两颗子树
  •     每一个节点中有N个元素,和N+1个指针。每一个节点中的元素不得小于最大节点容量的1/2
  •     全部的叶子位于同一层级(这也是为何叫平衡树)
  •     父节点元素向左的指针必须小于节点元素,向右的指针必须大于节点元素,好比图1中Q的左指针必须小于Q,右指针必须大于Q

 

为何要使用B树

    在计算机系统中,存储设备通常分为两种,一种为主存(好比说CPU二级缓存,内存等),主存通常由硅制成,速度很是快,但每个字节的成本每每高于辅助存储设备不少。还有一类是辅助存储(好比硬盘,磁盘等),这种设备一般容量会很大,成本也会低不少,可是存取速度很是的慢,下面咱们来看一下最多见的辅存--硬盘。数据结构

    硬盘做为主机中除了惟一的一个机械存储设备,速度远远落后于CPU和内存。图2是一个典型的磁盘驱动器。性能

    

    图2.典型的磁盘驱动器工做原理spa

 

    一个驱动器包含若干盘片,以必定的速度绕着主轴旋转(好比PC常见的转速是7200RPM,服务器级别的有10000RPM和15000RPM的),每一个盘片表面覆盖一个可磁化的物质.每一个盘片利用摇臂末端的磁头进行读写。摇臂是物理链接在一块儿的,经过移动远离或贴近主轴。设计

    由于有机械移动的部分,因此磁盘的速度相比内存而言是很是的慢。这个机械移动包括两个部分:盘旋转和磁臂移动。仅仅对于盘旋转来讲,好比常见的7200RPM的硬盘,转一圈须要60/7200≈8.33ms,换句话说,让磁盘完整的旋转一圈找到所须要的数据须要8.33ms,这比内存常见的100ns慢100000倍左右,这还不包括移动摇臂的时间。3d

    由于机械移动如此的花时间,磁盘会每次读取多个数据项。通常来讲最小单位为簇。而对于SQL Server来讲,则为一页(8K)。指针

    但因为要查找的数据每每很大,不能所有装入主存。须要磁盘来辅助存储。而读取磁盘则是占处理时间最重要的一部分,因此若是咱们尽量的减小对磁盘的IO操做,则会大大加快速度。这也是B树设计的初衷。

    B树经过将根节点放入主存,其它全部节点放入辅存来大大减小对于辅存IO的操做。好比图1中,我若是想查找元素Y,仅仅须要从主存中取得根节点,再根据根节点的右指针作一次IO读,再根据这个节点最右的指针作一次IO读,就能够找到元素Y。相比其余数据结构,仅仅作两次辅存IO读大大减小了查找的时间。

 

B树的高度

    根据上面的例子咱们能够看出,对于辅存作IO读的次数取决于B树的高度。而B树的高度由什么决定的呢?

     根据B树的高度公式:    

      其中T为度数(每一个节点包含的元素个数),N为总元素个数.

     咱们能够看出T对于树的高度有决定性的影响。所以若是每一个节点包含更多的元素个数,在元素个数相同的状况下,则更有可能减小B树的高度。这也是为何SQL Server中须要尽可能以窄键创建汇集索引。由于SQL Server中每一个节点的大小为8092字节,若是减小键的大小,则能够容纳更多的元素,从而减小了B树的高度,提高了查询的性能。

    上面B树高度的公式也能够进行推导得出,将每一层级的的元素个数加起来,好比度为T的节点,根为1个节点,第二层至少为2个节点,第三层至少为2t个节点,第四层至少为2t*t个节点。将全部最小节点相加,从而获得节点个数N的公式:

               

    两边取对数,则能够获得树的高度公式。

    这也是为何开篇所说每一个节点必须至少有两个子元素,由于根据高度公式,若是每一个节点只有一个元素,也就是T=1的话,那么高度将会趋于正无穷。

 

转帖:http://www.cnblogs.com/CareySon/archive/2012/04/06/Imple-BTree-With-CSharp.html

相关文章
相关标签/搜索