在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。
B-Tree
B-Tree是一種平衡的多路**查詢(又稱排序)**樹,在檔案系統中和資料庫系統中有所應用。主要用作檔案的索引。其中的B就表示平衡(Balance) 。
B-Tree的特性
為了描述B-Tree,首先定義一條資料記錄為一個二元組[key, data],key為記錄的鍵值,對於不同資料記錄,key是互不相同的;data為資料記錄除key外的資料。那麼B-Tree是滿足下列條件的資料結構:
d為大於1的一個正整數,稱為B-Tree的度
h為一個正整數,稱為B-Tree的高度
key和指標互相間隔,節點兩端是指標
一個節點中的key從左到右非遞減排列
所有節點組成樹結構
每個指標要麼為null,要麼指向另外一個節點
每個非葉子節點由n-1個key和n個指標組成,其中d<=n<=2d
每個葉子節點最少包含一個key和兩個指標,最多包含2d-1個key和2d個指標,葉節點的指標均為null
所有葉節點具有相同的深度,等於樹高h
如果某個指標在節點node最左邊且不為null,則其指向節點的所有key小於key1,其中key1為node的第一個key的值
如果某個指標在節點node最右邊且不為null,則其指向節點的所有key大於keym,其中keym為node的最後一個key的值
如果某個指標在節點node的左右相鄰key分別是keyi和keyi+1且不為null,則其指向節點的所有key小於keyi+1且大於keyi
B-Tree查詢資料
B-Tree是一個非常有效率的索引資料結構。這主要得益於B-Tree的度可以非常大,高度會變的非常小,只需要二分幾次就可以找到資料。例如一個度為d的B-Tree,設其索引N個key,則其樹高h的上限為logd((N+1)/2)),檢索一個key,其查詢節點個數的漸進複雜度為O(logdN)。
在B-Tree中按key檢索資料的演算法非常直觀:
-
首先從根節點進行二分查詢,如果找到則返回對應節點的data
-
否則對相應區間的指標指向的節點遞迴進行查詢,如果找到則返回對應節點的data
-
如果找不到,則重複過程2,直到找到節點或找到null指標,前者查詢成功,後者查詢失敗。
B+Tree
B+Tree是B-Tree的一種變種。一般來說,B+Tree比B-Tree更適合實現外儲存索引結構,具體原因與外儲存器原理及計算機存取原理有關,將在下篇文章中討論。
B+Tree的特性
區別於B-Tree:
每個節點的指標上限為2d而不是2d+1
內節點不儲存data,只儲存key;葉子節點不儲存指標
帶有順序訪問指標的B+Tree
一般在資料庫系統或者檔案系統中,並不是直接使用B+Tree作為索引資料結構的,而是在B+Tree的基礎上做了優化,增加了順序訪問指標。提升了區間查詢的效能。
如上圖所示,在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的B+Tree。例如要查詢18到30之間的資料記錄,只要先找到18,然後順著順序訪問指標就可以訪問到所有的資料節點。這樣就提升了區間查詢的效能。資料庫的索引全掃描 index和索引範圍掃描 range 就是基於此實現的。
參考
—–END—–
喜歡本文的朋友們,歡迎掃一掃下圖關注公眾號擼碼那些事,收看更多精彩內容