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-樹的查找

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

B-tree的插入 

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

B+tree

  B+樹是B-樹的變體。

  有幾點不同的地方:

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

 

參考

http://blog.csdn.net/hguisu/article/details/7786014

http://blog.sina.com.cn/s/blog_6776884e0100ohvr.html

http://baike.baidu.com/link?url=8Au1iocebretZtJN2E6JcIolkM79PDwQ22dJEESfntDvYUXHKfZ45s4zcd4PoCjm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM