資料庫索引背後的資料結構

2022-02-13 12:07:53 字數 2728 閱讀 4452

在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。

b-tree是一種平衡的多路查詢(又稱排序)樹,在檔案系統中和資料庫系統中有所應用。主要用作檔案的索引。其中的b就表示平衡(balance)

為了描述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的度可以非常大,高度會變的非常小,只需要二分幾次就可以找到資料。例如乙個度為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:

每個節點的指標上限為2d而不是2d+1

內節點不儲存data,只儲存key;葉子節點不儲存指標

一般在資料庫系統或者檔案系統中,並不是直接使用b+tree作為索引資料結構的,而是在b+tree的基礎上做了優化,增加了順序訪問指標。提公升了區間查詢的效能。

如上圖所示,在b+tree的每個葉子節點增加乙個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的b+tree。例如要查詢18到30之間的資料記錄,只要先找到18,然後順著順序訪問指標就可以訪問到所有的資料節點。這樣就提公升了區間查詢的效能。資料庫的索引全掃瞄 index索引範圍掃瞄 range就是基於此實現的。

mysql索引背後的資料結構及演算法原理

推薦閱讀

mysql——通過explain分析sql的執行計畫

mysql——索引基礎

mysql——索引優化實戰

資料庫索引 資料結構

我們就來說一說其中的原因。改進後的b 樹基於b 樹,b 樹又基於b樹,所以我們先從b樹談起 我們還是以person id,name,age 這個例項來講訴b樹。b樹是這樣的乙個資料結構 d為大於1的乙個正整數,稱為b tree的度。h為乙個正整數,稱為b tree的高度。每個非葉子節點由n 1個ke...

資料庫索引使用的資料結構

說白了,索引問題就是乙個查詢問題。資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。索引的實現通常使用b樹及其變種b 樹。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算...

資料庫之索引的資料結構

索引的資料結構主要有以下幾種 1 生成索引,建立二叉查詢樹 二叉排序樹 二叉搜尋樹進行二分查詢 2 平衡二叉樹,紅黑樹 3 生成索引,建立b tree b樹 b 樹 結構進行查詢 4 生成索引,建立b tree b 樹 結構進行查詢 5 生成索引,建立hash結構進行查詢 6 生成索引,建立位圖結構...