Btree 索引
索引是幫助數據庫高效獲取數據的一種數據結構,通過提取句子主干,就可以得到索引的本質。
m-way查找樹
如果想了解Btree
,需要首先了解m-way
數據結構。
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
查找樹,它可以利用多個分支節點(子樹節點)來減少查詢數據時所經歷的節點數,從而達到節省存取時間的目的。
主要特點如下,
- 每個節點的key數量小於m個(與m-way相同)
- 除根節點和葉子節點的其他節點存儲key的個數必須大於等於
m/2
- 所有葉子節點都處於同一層,也就是說所有葉節點具有相同的深度h(樹的高度,也意味着樹是平衡的)
Btree的查找
必須從根節點開始采用二分法查找,所以時間復雜度為O(logn)
。
Btree的插入
為了保證樹的平衡,如果帶插入節點的key數量小於m-1個,則直接插入(不會違反第一條特性),否則,需要將該節點分為兩部分,再執行該操作。
詳細插入操作可參考: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相比,高度更大。