資料庫索引 B 樹

2021-10-08 10:06:47 字數 2123 閱讀 3616

目錄特點

例項 查詢

插入 刪除

總結b+樹是b樹的變種,查詢效率比b更高。為什麼更高?往下看。

參考:

1.有k個子樹的中間節點包含有k個元素(b樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料

都儲存在葉子節點。

2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小

自小而大順序鏈結。

3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

3階b+樹:

b+樹通常有兩個指標,乙個指向根結點,另乙個指向關鍵字最小的葉子結點。因些,對於b+樹進行查詢兩種運算:一種是從最小關鍵字起順序查詢,另一種是從根結點開始,進行隨機查詢。

b+樹的優勢在於查詢效率上,下面我們做一具體說明:

首先,b+樹的查詢和b樹一樣,類似於二叉查詢樹。起始於根節點,自頂向下遍歷樹,選擇其分離值在要查詢值的任意一邊的子指標。在節點內部典型的使用是二分查詢來確定這個位置。

(1)b+樹中間節點沒有衛星資料(索引元素所指向的資料記錄),只有索引。而b樹每個結點中的每個關鍵字都有衛星資料;這就意味著同樣的大小的磁碟頁可以容納更多節點元素,在相同的資料量下,b+樹更加「矮胖」,io操作更少

b樹的衛星資料:

b+樹的衛星資料:

需要補充的是,在資料庫的聚集索引(clustered index)中,葉子節點直接包含衛星資料。在非聚集索引(nonclustered index)中,葉子節點帶有指向衛星資料的指標。

(2)因為衛星資料的不同,導致查詢過程也不同;b樹的查詢只需找到匹配元素即可,最好情況下查詢到根節點,最壞情況下查詢到葉子結點,所說效能很不穩定,而b+樹每次必須查詢到葉子結點,效能穩定

(3)在範圍查詢方面,b+樹的優勢更加明顯

b樹的範圍查詢需要不斷依賴中序遍歷。首先二分查詢到範圍下限,在不斷通過中序遍歷,知道查詢到範圍的上限即可。整個過程比較耗時。

而b+樹的範圍查詢則簡單了許多。首先通過二分查詢,找到範圍下限,然後同過葉子結點的鍊錶順序遍歷,直至找到上限即可,整個過程簡單許多,效率也比較高。

例如:同樣查詢範圍[3-11],兩者的查詢過程如下:

b樹的查詢過程:

b+樹的查詢過程:

b+樹的插入與b樹的插入過程類似。不同的是b+樹在葉結點上進行,如果葉結點中的關鍵碼個數超過m,就必須**成關鍵碼數目大致相同的兩個結點,並保證上層結點中有這兩個結點的最大關鍵碼。

b+樹中的關鍵碼在葉結點層刪除後,其在上層的複本可以保留,作為乙個」分解關鍵碼」存在,如果因為刪除而造成結點中關鍵碼數小於ceil(m/2),其處理過程與b-樹的處理一樣。在此,我就不多做介紹了。

b+樹相比b樹的優勢:

1.單一節點儲存更多的元素(更多指標),使得查詢的io次數更少;

2.所有查詢都要查詢到葉子節點,查詢效能穩定;

3.所有葉子節點形成有序鍊錶,便於範圍查詢。

為什麼mysql的索引要使用b+樹而不是其它樹形結構?比如b樹?

這個問題的複雜版本可以參考本文;

簡單回答是:

因為b樹不管葉子節點還是非葉子節點,都會儲存資料,這樣導致在非葉子節點中能儲存的指標數量變少(有些資料也稱為扇出)

指標少的情況下要儲存大量資料,只能增加樹的高度,導致io操作變多,查詢效能變低;

資料庫索引 B樹索引

b樹索引能自動的保持和資料檔案大小相適應的索引層次。通過對所使用的儲存塊空間進行管理,使每個塊的充滿程度在半滿和全滿之間。這樣的索引不再需要溢位塊。b 樹的資料結構 通常b樹有三層 跟 中間層和葉。葉子節點是乙個塊,它儲存了n個 鍵值,資料記錄指標 對,外加乙個指向下乙個兄弟葉子節點的指標。葉子節點...

資料庫索引(B樹,B 樹,雜湊)

一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一索引 不允許其中任何兩行具有相同值的索引 使用主鍵和候選鍵建立的索引就...

資料庫索引(B樹,B 樹,雜湊)

資料庫索引是儲存引擎用於快速找到記錄的一種資料結構。高效能mysql 一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一...