我們就來說一說其中的原因。
改進後的b+樹基於b+樹,b+樹又基於b樹,所以我們先從b樹談起
我們還是以person(id,name,age)這個例項來講訴b樹。
b樹是這樣的乙個資料結構:
如圖所示:d為大於1的乙個正整數,稱為b-tree的度。
h為乙個正整數,稱為b-tree的高度。
每個非葉子節點由n-1個key和n個指標組成,其中d<=n<=2d。
每個葉子節點最少包含乙個key和兩個指標,最多包含2d-1個key和2d個指標,葉節點的指標均為null 。
所有葉節點具有相同的深度,等於樹高h。
key和指標互相間隔,節點兩端是指標。
乙個節點中的key從左到右非遞減排列。
所有節點組成樹結構。
每個指標要麼為null,要麼指向另外乙個節點。
如果某個指標在節點node最左邊且不為null,則其指向節點的所有key小於v(key1),其中v(key1)為node的第乙個key的值。
如果某個指標在節點node最右邊且不為null,則其指向節點的所有key大於v(keym),其中v(keym)為node的最後乙個key的值。
如果某個指標在節點node的左右相鄰key分別是keyi和keyi+1且不為null,則其指向節點的所有key小於v(keyi+1)且大於v(keyi)。
這是乙個度為2,key為id的b樹,b樹中的每個節點存放了一系列person。
根據id查詢乙個person的演算法複雜度為o(log[2]n)
可見,度越大的b樹儲存效率越高,在度為d的b樹種查詢的時間複雜度為o(log[d]n)遠小於二叉查詢樹
b樹有許多變種,最常見的就是b+樹,相比於前者,具有如下特點:
如下圖所示:每個節點的指標上限為2d而不是2d+1。
內節點不儲存data,只儲存key;葉子節點不儲存指標。
相比於b樹,b+樹的非葉節點僅僅儲存了key和對應的指標,所有的person都存放在葉子節點中。
至於為什麼使用b+樹而非b樹,因為b+樹更適合放在外部儲存(非記憶體)中實現,具體原因我們後面會講到
更高階的b+樹:
在普通b+樹的基礎上,對葉子節點進行指標相連。
原本查詢id為31和57的兩個person,需要從根節點遍歷到31所在節點一次,從根節點遍歷到57所在節點一次。在帶有順序訪問指標的節點b+樹種,找到31所在的節點後,只要順著節點和指標遍歷下去便可訪問到所需要的資料了,極大提高了區間查詢效率
資料庫索引使用的資料結構
說白了,索引問題就是乙個查詢問題。資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算...
資料庫之索引的資料結構
索引的資料結構主要有以下幾種 1 生成索引,建立二叉查詢樹 二叉排序樹 二叉搜尋樹進行二分查詢 2 平衡二叉樹,紅黑樹 3 生成索引,建立b tree b樹 b 樹 結構進行查詢 4 生成索引,建立b tree b 樹 結構進行查詢 5 生成索引,建立hash結構進行查詢 6 生成索引,建立位圖結構...
資料庫索引背後的資料結構
在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。b tree是一種平衡的多路查詢 又稱排序 樹,在檔案系統中和資料庫系統中有所應用。主要用作檔案的索引。其中的b就表示平衡 bal...