B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减小IO操做大量被应用。遗憾的是,他们并无说明为何取名为B树,但按照B树的性质来讲B一般被解释为Balance。在国内一般有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。html
一个典型的 B树如图1所示。数据库
图1.一个典型的B树缓存
符合以下特征的树才能够称为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读大大减小了查找的时间。
根据上面的例子咱们能够看出,对于辅存作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