資料庫之索引的資料結構

2021-10-06 10:49:05 字數 3389 閱讀 8038

索引的資料結構主要有以下幾種:

(1)生成索引,建立二叉查詢樹/二叉排序樹/二叉搜尋樹進行二分查詢;

(2)平衡二叉樹,紅黑樹;

(3)生成索引,建立b-tree(b樹/b-樹)結構進行查詢;

(4)生成索引,建立b+ - tree(b+樹)結構進行查詢;

(5)生成索引,建立hash結構進行查詢;

(6)生成索引,建立位圖結構進行查詢。

1、 二叉查詢樹

二叉查詢樹的特點:

(1)二叉查詢樹的每乙個節點的值都大於其左子樹上所有節點的值,且小於其右子樹上所有節點的值;

(2)二叉查詢樹的每乙個節點的左、右子樹也分別是一棵二叉查詢樹。

平衡二叉查詢樹的特點:任意乙個節點的左、右子樹的高度(從該節點到葉子節點的最長路徑的邊數)之差不超過1(<=1)。

二叉查詢樹是通過二分查詢,時間複雜度是o(logn),其中n是節點數。

2、 b-tree(b樹/b-樹)

b-tree(b樹/b-樹)是乙個平衡多路查詢樹,樹中的每乙個節點至多包含m個子節點,稱為m階b-tree(b樹/b-樹),如上圖所示m=3即3階b-tree(b樹/b-樹)。節點中儲存了關鍵字和指向每乙個子節點的指標。

b-tree(b樹/b-樹)的定義如下(其目的是為了讓每個索引塊盡可能地儲存更多的資訊,並且盡可能地減少i/o次數):

(1)根節點至少包含2個孩子;

(2)樹中的每個節點至多包含m個孩子(m>=2);

(3)除了根節點和葉子節點以外,其他節點至少包含ceil(m/2)(表示m/2向上取整,即取大於等於m/2的最小整數)個孩子;

(4)所有的葉子節點均位於同一層上;

(5)假設每個節點儲存了n個關鍵字資訊,其中

a)k[i](i=1,2,…,n)為關鍵字,且關鍵字按照公升序順序排序,即k[i-1]b-tree(b樹/b-樹)的時間複雜度為o(logn),其中n是節點數。

3、 b+ - tree(b+樹)

b+樹相比於b樹、二叉查詢樹在檔案系統以及資料庫系統中更有優勢,更適合做儲存索引,主要原因如下:

(1)b+樹的磁碟讀寫代價更低:因為b+樹的非葉子節點僅用來索引而不儲存資料,因此可以儲存更多的關鍵字資訊,如果將同乙個內部節點中的關鍵字儲存在同乙個盤塊中,則這個盤塊可以容納的關鍵字也就越多,一次性讀入記憶體中需要查詢的關鍵字也就越多,相對來說磁碟讀寫次數也就降低了;

(2)b+樹的查詢效率更穩定:因為對b+樹的檢索都必須走一條從根節點到葉子節點的路徑,所有的搜尋都會在葉子節點處終結,所有關鍵字的查詢長度相同,因此各個資料的查詢效率也就相同,都是穩定的o(logn);

(3)b+樹更有利於資料庫的掃瞄:因為b+樹的所有葉子節點均有乙個鏈指標指向下乙個葉子節點,因此只需要遍歷葉子節點就可以實現對全部關鍵字的掃瞄,範圍查詢效率更高。

4、 hash索引

一些資料庫的儲存引擎還支援hash這種資料結構作為其索引,hash這種資料結構通過計算雜湊函式只需一次定位就可以找到所要查詢的資料所在的桶(buckets),而b+樹這種資料結構在檢索時需要訪問根節點、非葉子節點、一直到葉子節點處才能訪問到我們所需要的資料,這樣可能會經過多次i/o訪問,因此理論上hash索引的查詢效率要比b+樹索引高。

如上圖所示,比如我們想要訪問keys為sandra dee的資訊,那麼就可以通過一次雜湊函式的計算就定位到相應的桶(buckets)即第152號桶中,然後將第152號桶的entries(是乙個鍊錶)全部載入到記憶體中,最後就可以順著join smith的指標定位到sandra dee了。

hash索引的缺點:

(1)僅僅能滿足「=」和「in」,而不能進行範圍查詢(由於hash索引比較的是經過雜湊運算之後的hash值,因此只能用於等值過濾,而不能用於範圍查詢。因為經過雜湊運算後的hash值的大小關係並不能夠保證與雜湊運算前的鍵值的大小關係完全一致,如上圖中的join smith和sandra dee經過雜湊運算後就得到了相同的hash值,但這並不能表示它們實際的大小關係)。

(2)無法被用來避免資料的排序操作(由於hash索引中存放的是經過雜湊運算後的hash值,而hash值的大小關係並不一定與雜湊運算前的鍵值的大小關係完全一致,因此資料庫無法利用索引的資料避免任何的排序操作)。

(3)不能使用部分索引鍵查詢(對於組合索引即乙個索引中包含多個列的情況,hash索引在計算hash值的時候是將組合索引鍵合併之後再一起計算hash值,而不是單獨計算hash值。當使用組合索引的前面的乙個或者幾個索引鍵進行查詢的時候,hash索引也無法被利用;而b+樹索引是支援利用組合索引的部分索引鍵的)。

(4)在任何時候都不能避免表掃瞄(hash索是將索引鍵通過雜湊運算,將雜湊運算結果的hash值和所對應的行指標資訊存放在乙個buckets中,由於存在不同索引鍵在經過雜湊函式運算之後可能得到相同的hash值的情況,因此即使取到滿足hash值的buckets中的那些資料,也無法在hash索引中直接完成查詢,還是要訪問buckets中的實際資料進行相應比較)。

(5)遇到大量hash值相等的情況時效能並不一定就比b+樹索引要高(對於選擇性比較小的索引鍵,如果要對其建立hash索引,那麼就可能會存在大量記錄指標資訊存放於同乙個buckets中的情況,這樣要定位到某個記錄就會非常麻煩,從而造成整體效能低下。在極端情況下,所有的索引鍵在經過雜湊運算之後都得到了相同的hash值,對映到了同乙個buckets中,這樣在訪問該buckets中的鍊錶中的最後乙個元素時,就會變成線性的o(n)的時間複雜度了)。

5、 位圖索引

當表中的某個字段只有幾種值時,比如性別只有男、女兩種情況,如果只是為了在該字段上實現高效地統計,此時可以考慮使用位圖索引。但目前主流的資料庫中支援位圖索引的資料庫較少,比如oracle資料庫。位圖類似於b+樹,在葉子節點處包含有指定的位圖段,由於只需要儲存是與否,因此可以使用乙個bit位來表示,因此理論上在乙個葉子塊中可以儲存很多的bit位來表示不同的行。

位圖索引的侷限性:

(1)位圖索引只適用於表中某個欄位僅有幾種值(或者幾種狀態)的情況;

(2)位圖索引的鎖的粒度非常大,當需要新增或者刪除一條記錄時,通常會鎖住與其在同乙個點陣圖中的其他操作,因為某行的位置順序可能會由於插入或者刪除一條記錄而發生改變,因此不適用於高併發的場景,而只適用於併發較少且統計較多的場景。

總結:通常情況下,索引的資料結構主要是b+樹結構,比較小眾的索引的資料結構還有hash結構和點陣圖。

資料庫索引 資料結構

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

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

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

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

在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。b tree是一種平衡的多路查詢 又稱排序 樹,在檔案系統中和資料庫系統中有所應用。主要用作檔案的索引。其中的b就表示平衡 bal...