1. 程式人生 > 其它 >為什麼MySQL資料庫索引選擇B+樹

為什麼MySQL資料庫索引選擇B+樹

樹是非常重要的一種資料結構,下面先講幾種常見的樹結構,並分析它們為什麼不適用於資料庫索引。

AVL樹

平衡二叉樹的定義如下:首先符合二叉查詢樹的定義,其次必須滿足任何節點的兩個子節點的高度差不大於1。平衡二叉樹的查詢速度確實很快,但是維護一棵平衡二叉樹的代價是非常大的,不管我們執行插入還是刪除,一旦不滿足條件就需要通過左旋和右旋來保持平衡性,所以AVL樹適合用於插入刪除次數比較少,但查詢多的情況。

紅黑樹

紅黑樹是一種弱平衡二叉樹,相對於AVL樹來說它的旋轉次數會變少,所以適用於插入刪除操作比較頻繁的情況。紅黑樹的五條定義:
  • 所有節點不是紅色就是黑色
  • 根節點是黑色
  • 葉子節點是null節點(空節點)且為黑色。
  • 同一路徑中,不存在連續的紅色節點。
  • 每個節點到它所能到的葉子節點經過的黑色節點數相同。

從根節點到葉子節點的所有路徑中,最長路徑不會超過最短路徑的2倍,這保持了紅黑樹的弱平衡。在Java中,TreeMap、TreeSet都使用紅黑樹作為底層資料結構,JDK 1.8開始,HashMap也引入了紅黑樹:當衝突的連結串列長度超過8時,自動轉為紅黑樹。

B+樹

B+樹是為磁碟或其他直接存取輔助裝置設計的一種資料結構,在B+樹中,非葉子節點相當於是葉子節點的索引,葉子節點才是儲存資料的資料層,所有記錄都是按鍵值的大小順序存放在同一層的葉子結點上,由各葉子結點指標進行連線,B+樹的插入必須保證插入後的葉子結點依然有序。(圖片來自:https://blog.csdn.net/cxu123321/article/details/105665056/)

所以為什麼B+樹更適合資料庫索引呢?
分析:

資料庫的資料一般儲存在磁碟中,讀取資料時需要訪問磁碟,我們知道讀取磁碟資料的時間是由磁碟定位的時間+資料讀取時間,而且定位的時間要遠大於讀取的時間,二叉樹型別的結構可以將查詢速度提升到\(O(log_2 N)\),但是最壞的情況要查詢到二叉樹的最深層,這在資料量很大時是不能接受的,B+樹有高扇出性的特點,所以在這種情況下,矮胖的B+樹相比於高瘦的AVL樹(或者紅黑樹)就能減少訪問的層數,提升查詢效率。在資料庫中,B+樹的高度一般都在2-4層,這就是說查詢某一鍵值的記錄最多隻需要2-4次IO。

那為什麼採用B+樹不用B樹呢?
原因:

B樹在提高了IO效能的同時並沒有解決元素遍歷效率低下的問題(B樹因為分支結點同樣儲存著資料,所以如果要查詢某個範圍的資料,需要進行一次中序遍歷)。為了解決這個問題,B+樹應用而生,B+樹的中間節點儲存的只是葉子節點的索引,所有資料都儲存在葉子結點中,所以只需要遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,B樹不支援這樣的操作或者說效率太低。

參考:
https://blog.csdn.net/cxu123321/article/details/105665056/