Btree 索引

Btree 索引

索引是幫助數據庫高效獲取數據的一種數據結構,經過提取句子主幹,就能夠獲得索引的本質。html

m-way查找樹

若是想了解Btree,須要首先了解m-way數據結構。node

m-way查找樹是是一種樹形的存儲結構,主要特色以下,數據庫

  • 每一個節點存儲的key數量小於m個
  • 每一個節點的度小於等於m
  • 節點key按順序排序
  • 子樹key值要徹底小於、大於或介於父節點之間

例如,
3-way如圖,m爲3,那麼每一個節點最多擁有爲2個(m-1),數據結構

待索引元素列表爲:
[5, 7, 12, 6, 8, 3, 4]

Btree查找樹

Btree是一種平衡的m-way查找樹,它能夠利用多個分支節點(子樹節點)來減小查詢數據時所經歷的節點數,從而達到節省存取時間的目的。指針

主要特色以下,code

  • 每一個節點的key數量小於m個(與m-way相同)
  • 除根節點和葉子節點的其餘節點存儲key的個數必須大於等於m/2
  • 全部葉子節點都處於同一層,也就是說全部葉節點具備相同的深度h(樹的高度,也意味着樹是平衡的)

Btree的查找

必須從根節點開始採用二分法查找,因此時間複雜度爲O(logn)htm

Btree的插入

爲了保證樹的平衡,若是帶插入節點的key數量小於m-1個,則直接插入(不會違反第一條特性),不然,須要將該節點分爲兩部分,再執行該操做。blog

詳細插入操做可參考:http://www.cnblogs.com/yangecnu/p/introduce-b-tree-and-b-plus-tree.html排序

B+tree查找樹

B+tree是基於Btree的變體,與Btree不一樣之處在於,索引

  • 非葉子節點的key個數等於m
  • 每一個節點的下級指針爲n個(n爲關鍵字個數,而不是n+1個)
  • 爲全部葉子節點增長一個鏈指針(注意鏈上的數據是有序的)
  • 全部key都存在葉子節點中

爲何使用Btree結構

索引自己也很大,不可能所有存儲在內存中,所以索引每每以索引文件的形式存儲的磁盤上。
索引查找過程當中就要產生磁盤I/O消耗,相對於內存存取,I/O存取的消耗要高几個數量級,因此評價一個數據結構做爲索引的優劣最重要的指標就是在查找過程當中磁盤I/O操做次數的漸進複雜度。(換句話說,索引的結構組織要儘可能減小查找過程當中磁盤I/O的存取次數。)

爲了達到下降磁盤I/O的目的

  • 磁盤按需讀取,要求每次都會預讀的長度通常爲頁的整數倍, 數據庫系統將一個節點的大小設爲等於一個頁,這樣每一個節點的元素數據只須要一次I/O就能夠徹底載入
  • 每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁裏,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O
  • 把B-tree中的m值設的很是大,就會讓樹的高度下降,有利於一次徹底載入

紅黑樹

紅黑樹BST的時間複雜度是依賴於樹的高度,可是,紅黑樹的高度與Btree相比,高度更大。

相關文章
相關標籤/搜索