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