1. 程式人生 > >B-tree B+tree 資料結構解析

B-tree B+tree 資料結構解析

B-tree,B是balance,一般用於資料庫的索引。使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度。而B+tree是B-tree的一個變種,大名鼎鼎的MySQL就普遍使用B+tree實現其索引結構。

  那資料庫為什麼使用這種結構?

  一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟I/O消耗,相對於記憶體存取,I/O存取的消耗要高几個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查詢過程中磁碟I/O操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數。

  為了達到這個目的,磁碟按需讀取,要求每次都會預讀的長度一般為頁的整數倍。而且資料庫系統將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入。每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也儲存在一個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了一個node只需一次I/O。並把B-tree中的m值設的非常大,就會讓樹的高度降低,有利於一次完全載入。

m-way查詢樹

  首先介紹一下m-way查詢樹,顧名思義就是一棵樹的每個節點的度小於等於m。

  故,它的性質如下:

  1. 每個節點的鍵值數小於m
  2. 每個節點的度小於等於m
  3. 鍵值按順序排列
  4. 子樹的鍵值要完全小於或大於或介於父節點之間的鍵值

B-tree

  B-tree是一種平衡的m-way查詢樹。

  B-tree利用多個分支(稱為子樹)的結點,減少獲取記錄時所經歷的結點數,從而達到節省存取時間的目的。

  

  一棵度為m的B-tree應滿足的性質:

  1. 每個結點的子結點個數≤m;
  2. 根結點若不是葉子結點,它至少有兩個子結點
  3. 除根和葉子結點外,每個結點的子結點個數≥ [m/2]
  4. 所有的葉子結點都出現在同一層,而且不帶有資訊
  5. 非葉子結點若具有j+1個子結點,那麼它包含j個關鍵字(其中,j≤m-1)

  B-樹的非葉子結點的結構形式:

ki (1≤i≤j)是關鍵字,所有關鍵字的值是唯一的;pi (0≤i≤j)是指向該結點的子結點的指標

例如圖中的P1,它指向的子樹的關鍵字應該大於k1,小於k2

B-樹的查詢

       在給定的m階B-樹中查詢一個給定值v相等的關鍵字,必須從根結點開始進行查詢,一般採用二分查詢

B-tree的插入 

  1.   插入的節點少於M-1個鍵值,則直接插入。
  2.   插入的節點的鍵值已等於m-1,則將此節點分為二,因為一棵m的B-tree,最多隻能有m-1個鍵值

B+tree

  B+樹是B-樹的變體。

  有幾點不同的地方:

  1. 非葉子結點的子樹指標與關鍵字個數相同
  2. 為所有葉子結點增加一個鏈指標
  3. 所有關鍵字都在葉子結點出現

轉自 

http://www.cnblogs.com/coder2012/p/3330311.html

參考

http://blog.codinglabs.org/articles/theory-of-mysql-index.html