Mysql索引資料結構為什麼是B+樹?

炒燜煎糖板栗 發表於 2021-06-05
MySQL 資料結構

Mysql索引資料結構

下面列舉了常見的資料結構

  • 二叉樹
  • 紅黑樹
  • Hash表
  • B-Tree(B樹)

Select * from t where t.col=5

我們在執行一條查詢的Sql語句時候,在資料量比較大又不加索引的情況下,逐行查詢並進行比對,每次需要從磁碟上查詢,每行資料可能在磁碟不同的位置,資料比較靠後的話,一千萬資料可能要比對幾百萬,很耗費資源。

Mysql衡量查詢效率的就是磁碟IO次數,那麼Mysql中應該採用什麼樣的資料結構儲存資料呢,以及為什麼要使用那個資料結構呢。

二叉樹

大多數人都知道,如果加上索引之後。把資料放在二叉樹裡面,查詢會快很多,但是還有一種特殊的情況:

把一個遞增列的索引放入二叉樹中,列id作為等於5查詢目標,就會從col為1開始搜尋,這樣要搜尋幾次?二叉樹插入的資料如果大於本身,會放在父節點的右下角,小的會放在父節點的左下角,因此形成了這樣像連結串列一樣的結構,其實本質還是二叉樹。

動畫2

需要從根節點遍歷,經過5次的查詢,每個節點都儲存在磁碟上,每查一個節點需要跟磁碟做一次IO互動,效率相比之前沒加索引也沒有太大提升,這顯然不是Mysql的索引結構。

紅黑樹

HasMap的資料結構就是紅黑樹,原來是陣列加連結串列,現在優化到了陣列加紅黑樹。

紅黑樹

紅黑樹本質還是二叉樹,還有一個名字又叫平衡二叉樹。當一邊子節點比另一邊高太多的時候,會自動旋轉平衡。當資料量比較大的時候比如1000萬,紅黑樹儲存的高度就可能達到幾十。如果資料量越大樹的高度就會越高。每查一個節點要進行一次磁碟IO互動。樹的高的越高查詢效率越低,很顯然紅黑樹也不是Mysql的資料結構,早期版本Mysql有用到紅黑樹,現在版本沒有用到紅黑樹。那麼能不能對紅黑樹做點改造。

B-Tree

樹的高的越高查詢效率越低,那麼將樹高縮小,比如限制在5層,把一層存放更多元素。把一個節點的資料在磁碟同一個區域全部查出來放到記憶體,只做一次IO查詢,就可以查到很多索引資訊。B樹又叫平衡多叉樹。

image-20210605200533774

索引值和具體data都在每個節點裡,而節點的位置不固定,最好的情況查詢值就在第一層。

B樹的特點就是每層節點數目非常多,層數很少,目的就是為了就少磁碟IO次數,B樹在提高了磁碟IO效能的同時並沒有解決元素遍歷的效率低下的問題,由於節點內部每個 key 都帶著 data 域,每次查詢到具體節點還要和data進行順序比對,如果查詢某個範圍內資料,又需要重新遍歷。正是為了解決這個問題,B+樹應運而生

B樹遍歷全部資料:

紅黑樹遍歷

B+Tree

B+樹節點只儲存 key 的副本,真實的 key 和 data 域都在葉子節點儲存,資料全部儲存在葉子節,並且每一個節點之間用指標串聯起來,形成連結串列,方便遍歷,可以跨區間訪問,這優點尤其突出在範圍查詢,不需要在一次從根節點到子節點遍歷。

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xNDQ2MDg3LTJkZTgyZDFhYTgyNjlhMTc

B+樹遍歷全部資料:

B+遍歷

資料量大的情況下哪個更快,我想你應該知道了吧!