MySQL索引為什麼使用B+樹?

維C發表於2020-12-15

有資料庫基礎的應該都瞭解資料庫利用索引能達到一個快速尋找資料的效果。

更深一點的可能瞭解到索引(InnoDB)是利用B+樹去實現的。

但是為什麼要用B+樹呢?

這世上樹那麼多,為何獨愛這一棵呢?

一切都源於一個網路’愛情故事’。

在城市居住的艾先生,通過網路認識了一個叫歐的女士. 通過幾個月的瞭解,艾先生發現自己愛了這位歐女士,於是向歐女士表白。

歐女士說:”我住在硬碟鎮,如果你能找到我,我就答應你”。

歐女士留下了一個地址(0X00000001)給歐先生。

歐先生乘坐高鐵來到了硬碟鎮,發現這裡的房子長的都很像, 想找到歐女士有點困難。

不過好在下車的第一個地方就是0X0000001,但是裡面只留下了一個盒子。

歐先生開啟盒子後,發現裡面有一張紙條寫著 0X00000005 , 於是歐先生繼續在硬碟鎮找尋這個地址。

一段時間後終於找到了, 但是裡面同樣的還是隻有一個盒子, 寫著 0X00000099。

過了N段時間後,終於找到了這個地址,也成功的找到了歐女士。

於是艾先生帶著歐女士回到了城市。

這個艾先生找尋歐女士花費的時間就是艾歐時間了,從一個盒子找到另一個盒子就是艾歐次數了。

可以看到想要快速的找到歐女士就要縮短尋找的次數。

所以,InnoDB在考慮資料結構時必然要考慮到IO次數的問題。

Hash

Hash結構等值搜尋可以達到O(1)的效果, 但是光不支援範圍搜尋就斃掉了。

二叉樹

樹結構的資料在查詢中,每一次查詢子樹都可以看作一次IO. 所以樹的高度和IO次數是相等的。

但由於樹的根節點一般都會放在記憶體,根節點不用耗費IO。

一般樹高為3的樹查詢最多需要2次IO。

  • 二叉搜尋樹

特點是左邊小於根節點,右邊大於根節點,但是插入新資料不會使之旋轉。

這也就導致了一個問題, 插入的資料連續時會退化成一個連結串列,任何搜尋都是掃全表.

  • AVL搜尋樹

也叫強平衡二叉搜尋樹,特點左右子樹的高度相差不能超過1.

這也就導致了它會頻繁的發生旋轉,影響寫入的效能。

  • 紅黑樹

特點紅色節點的子節點必須是黑色。

每個節點到子節點都必須經過相同的黑色點

這樣可以保證不會旋轉太頻繁,但是樹高是不可控的。

多叉樹

  • B樹

B樹的特點是每個節點都會儲存資料.

這樣雖然不用再發生IO去載入資料,但是能記錄的節點就少了。

  • B+樹

B+樹的特點是隻有葉子節點會儲存資料,這個特效能讓樹儘可能的記錄更多的節點。

InnoDB給這個B+樹加了’億’點細節, 每個頭尾節點都會記錄下一個或者上一個節點的指標, 這樣在做範圍查詢的時候就可以很完美的處理了。

任何不考慮硬體特性的程式都是耍流氓。

可以看到InnoDB為了穩定IO次數選擇了B+樹,又為了範圍搜尋新增了指標。

下一篇將會繼續講述B+樹到底如何儲存索引資料的,如果覺得寫的對你有幫助,勞煩一健三連呀。

本文圖片來源工具 : 動態資料結構網址

PS: 關注個人公眾號: “多邊形戰士”, 回覆”mysql” 送你經典MySQL學習書籍。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章