B樹B+樹以及基於B+樹的數據庫引擎特點

B樹(B-Tree)

一個m階B樹特點

  • 每個結點至多擁有m棵子樹

  • 根節點至少擁有兩顆子樹(存在子樹的情況下),根節點至少有一個關鍵字

  • 除了根節點以外,其餘每個分支節點至少有m/2棵子樹

  • 所有的葉子節點都在同一層上,B樹的葉子節點可以看成是一種外部節點,不包含任何信息

  • 有k棵子樹的分支節點則存在k-1個關鍵碼,關鍵碼按照遞增次序進行排列

  • 關鍵碼數量需滿足cell(m/2) - 1<= n  <= m - 1

cell()向上取整    floor()向下取整

 

特性:利用平衡樹的優勢,保證了查詢的穩定性和加快了查詢的速度

出現多路查找樹的數據結構,用在內存讀取外存的場景下,可以減少磁盤的IO次數,因爲在高階的情況下,樹不要很高就可以標識很大的數據量

B樹詳解:https://www.cnblogs.com/George1994/p/7008732.html

插入

通過搜索找到對應的結點進行插入,根據即將插入的結點的數量分爲以下幾種情況

  • 如果該結點的關鍵字個數沒有達到m-1個,那麼直接插入

  • 如果該結點的關鍵字個數已經到達了m-1個,那麼根據B樹的性質顯然無法滿足,需要將其進行分裂。分裂規則是該結點分成兩半,將中間的關鍵字進行提升,加入到父親節點中,但是這又可能存在父親結點也滿員的情況,則不得不向上進行回溯,甚至是要對根結點進行分裂,那麼整棵樹都加了一層

 

 

刪除

同樣的,我們需要先通過搜索找到相應的值,存在則進行刪除,需要考慮刪除以後的情況

  • 如果該結點擁有的關鍵字數量仍然滿足B樹性質,則不做任何處理

  • 如果該結點在刪除關鍵字以後不滿足B樹的性質(關鍵字沒有達到cell(m/2)-1的數量),則需要向兄弟結點借關鍵字,這又分爲兄弟結點的關鍵字數量是否足夠的情況

  1. 如果兄弟結點的關鍵字足夠借給該結點,則將父親結點的關鍵字下移,兄弟結點的關鍵字上移

  2. 如果兄弟結點的關鍵字在借出去以後也無法滿足B樹性質,即之前兄弟結點的關鍵字的數量爲cell(m/2)-1,借的一方的關鍵字數量爲cell(m/2)-2的時候,我們可以將結點合併到兄弟結點中,合併之後的子結點數量少了一個,則需要將父親結點的關鍵字下放,如果父親結點不滿足性質,則向上回溯

 

B+樹

操作

其操作被B樹的操作是類似的,不過需要注意的是,在增加的時候,如果存在滿員的情況,將選擇結點中的值作爲新的索引。還有在刪除值的時候,索引中的關鍵字並不會刪除,也不會存在父親結點關鍵字下沉得的情況,因爲僅僅是索引

 

B樹和B+樹的區別

以一個m階樹爲例

  • 關鍵字的數量不同;B+樹分支結點中有m個關鍵字,其葉子結點也有m個,其關鍵字只是起到了一個索引的作用,雖然B樹也有m個子結點,但是其只擁有m-1個關鍵字

  • 存儲的位置不同;B+樹中的數據都存儲在葉子結點上,也就是其所有葉子結點的數據組合起來就是完整的數據,但是B樹的數據存儲在每一個結點中,並不僅僅存儲在葉子結點上

  • 分支結點的構造不同;B+樹的分支結構存儲着關鍵字信息和兒子指針(這裏的指針指的是磁盤塊的偏移量),也就是說內部結點僅僅包含着索引信息(非葉子節點的子樹指針p[i],指向關鍵字屬於【k[i],k[i + 1]】的子樹)

  • 查詢不同;B樹在找到具體的數值以後就結束,而B+樹則需要通過索引找到葉子結點中的數據才結束,也就是說B+樹的搜索過程中走了一條從根結點到葉子結點的路徑,其高度是相同的,相對來說更加的穩定(更適合文件索引系統)

  • 區間訪問;B+樹的葉子結點會按照順序建立起鏈狀指針,可以進行區間訪問

 

B*樹

B*樹是B+樹的變形,在B+樹的非根和非葉子節點再增加指向兄弟節點的指針

  • B*樹定義了非葉子節點的關鍵字個數至少爲(2/3)*M,則塊的最低使用率爲2/3(代替B+樹的1/2)

  • B*樹的分裂,當一個結點滿的時候,如果它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父節點中兄弟結點的關鍵字(因爲兄弟結點關鍵字的範圍改變了);如果兄弟結點也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的數據到新結點,最後在 父節點增加新結點的指針

  • B*樹分配新結點的概率比B+樹要低,空間使用率更高

 

MySQL索引結構

B+樹最常見的應用就是用來索引,索引是幫助MySQL高效獲取數據的數據結構

MyISAM存儲引擎(5.5.8版本之前)

Mysql會在你配置的數據目錄下生成3個文件——hiro.MYD(存儲數據)、hiro.MYI(存儲索引)、hiro.frm(存儲表結構)——文件存儲提供了更好的跨平臺性

Mysql支持三種不同的存儲格式——動態的,固定的,壓縮的

索引文件(.MYI):包括頭部信息和索引值,頭部文件記錄了索引選項、索引文件大小和索引定義

該引擎爲MySQL默認引擎,但是未提供對數據庫事務的支持,也不支持行級鎖和外鍵,在更新和插入的時候需要鎖定整個表,所以效率較低

索引特色:MyISAM使用B+樹作爲索引結構,葉結點的data域放的是數據記錄的地址,在MyISAM中,主索引和輔助索引在結構上沒有任何區別,只是主索引要求key是唯一 的,而輔助索引的key可以重複

 

InnoDB存儲引擎(5.5.8版本之後)

InnoDB給MySQL提供了具有可回滾和防崩潰能力的事務型存儲引擎——保證了事務安全

在SELECT語句下提供了MVCC(多版本併發控制),還支持外鍵功能,在SQL查詢中可以將InnoDB類型的表和其他MySQL的表混合。由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高時,使用InnoDB引擎會提升效率,但是使用行級鎖也不是絕對的,如果執行SQL語句時不能確定要掃描的範圍,InnoDB表同樣會鎖全表

索引特色:

  • InnodeDB的數據文件本身就是索引文件,MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址,而InnoDB索引,表數據文件就是按B+Tree組織的一個索引結構,這棵樹的葉子節點data域保存了完整的數據記錄(聚集索引)

  • 因爲InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求必須有主鍵(沒有顯式指定則系統自動標識一個能夠唯一標識數據記錄的列作爲主鍵,不存在則自動生成一個6B的隱含字段)

  • InnodeDB的輔助索引data域存儲相應記錄主鍵而不是地址(輔助索引搜索需要檢索兩遍索引,首先檢索輔助索引獲得主鍵然後用主鍵到主索引中檢索獲得記錄)

 

 

應用場景:

  • MyISAM管理非事務表,提供高速存儲和檢索以及全文搜索能力,如果應用中執行大量的select操作,應該選擇MyISAM

  • InnoDB用於事務處理,具有ACID事務支持等特性,如果在應用中執行大量insert和update操作,應該選擇InnoDB

 

MySQL使用的是B+樹來存儲索引的,爲什麼不用其他的數據結構呢?

二叉樹->根據二叉樹的概念,當數據是遞增的時候,它的節點會一直增大下去

紅黑樹->平衡二叉樹->每個節點存一個值,同樣會導致節點過多

B樹->每個節點可存放多個值(解決紅黑樹高度過大的問題),但是涉及到範圍查詢的時候同樣不佔優勢

B+樹->葉子節點有指針相連(方便範圍查詢)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章