java教程視頻百度傳課,附小技巧

java教程視頻百度傳課,附小技巧

MySQL爲什麼不選擇平衡二叉樹

既然平衡二叉樹解決了普通二叉樹的問題,那麼mysql爲什麼不選擇平衡二叉樹做爲索引呢?java

索引須要存儲什麼

讓咱們想想,若是咱們要把索引存起來,那麼應該存哪些信息呢,它應該存儲三塊信息:mysql

  • 索引的值:就是表裏面索引列對應的值。git

  • 數據的磁盤地址(經過磁盤地址找到當前數據)或者直接存儲整條數據。面試

  • 子節點的引用:咱們須要從根節點往下走,因此須要知道左右子節點的地址。 根據這三點,能夠有以下大體的一個簡單的結構圖:sql

image.png

上圖中數字表示的是索引的值,0x開頭的表示磁盤地址,根節點中存了左右節點的引用。ide

AVL樹用來存儲索引存在什麼問題

咱們知道,頁(Page)是 Innodb 存儲引擎用於管理數據的最小磁盤單位,頁的默認大小爲16KB。頁也就是上圖中的節點,每查詢一次節點就須要進行一次IO操做,IO操做是一種很是耗時的操做,不少業務系統的瓶頸都是卡在IO操做上,因此若是咱們須要提升查詢效率的辦法之一就是減小IO次數,那麼問題就來了,AVL樹一個節點上只存了一個關鍵字(索引值)+一個磁盤地址+左右節點的引用,這是遠遠達不到16KB的,會浪費了大量的空間。指針

上圖中若是咱們要找到6這條數據,須要進行3次IO(獲取一個節點就是一個IO操做),若是這棵樹很高的話,就會進行大量的IO操做,因此說AVL樹存在的最大問題就是空間利用不足,浪費了大量空間,數據量大的時候就會成爲一顆瘦高的樹,那麼咱們能夠怎麼改進呢?答案很明顯了,那就是每一個磁盤塊多存一點東西,也就是說每一個磁盤多存幾個關鍵字,由於關鍵字越多,路數越多;路數越多,樹也就越矮越胖,相應的操做IO次數就會越少。視頻

多路平衡樹(Balanced Tree)

多路平衡樹簡稱B樹,又稱B-樹,和AVL樹同樣,B樹在枝節點和葉子節點存儲鍵值、磁盤地址、左右節點引用。請看下圖的一個多路平衡樹的示例:blog

image.png

B樹的特色

相比較AVL樹,B樹一個磁盤上能夠存多個關鍵字(值),並且有一個特色就是:教程

  • 分叉數(路數)永遠比關鍵字數多1。 咱們能夠畫出以下簡圖(下圖中只畫了3路,即兩個關鍵字,實際取決於一頁能存儲多少個關鍵字):

image.png

從上圖能夠很明顯的看出,一樣高度的樹,B樹能存的數據遠遠大於平衡二叉樹。

B樹是如何查找數據的

以上圖爲例,假如咱們要找key=32這個數字,首先獲取到根節點,發現18小於key,因此往右邊走,獲取到右邊的數據,54和76,這時候遵循如下原則:

  • key<54,命中最左邊分叉;

  • key=54,直接命中,返回數據;

  • 54<key<76,走中間的一個分叉;

  • key=76,直接命中,返回數據;

  • key>76,命中右邊分支; 這裏由於key=32,因此走得是第1條,命中左邊分支,這時候再去獲取左邊分支,獲取到32和50,比較發現key=32,命中,返回數據。

從上面咱們能夠看出B樹效率相對於AVL樹,在數據量大的狀況效率已經提升了不少,那麼爲何MySQL仍是不選擇B樹做爲索引呢? 那麼接下來讓咱們先看看改良版的B+樹,而後再下結論吧!

B+樹

B+樹由B樹改良而來,屬於改良版的多路平衡查找樹。 首先讓咱們來看看B+樹到底長什麼樣呢:

image.png

對比B+樹,咱們能夠發現一個很明顯的區別就是葉子節點有一個箭頭指引並且從左到右是有序的。

InnoDB中使用的B+樹相比較於傳統B+樹,改進以後的B+樹具備如下特色

InnoDB中B+樹的特色

  • 它的關鍵字的數量是跟路數相等的。

  • B+樹的根節點和枝節點中都不會存儲數據,只有葉子節點才存儲數據。而搜索到關鍵字不會直接返回,會到最後一層的葉子節點。

  • B+樹的每一個葉子節點增長了一個指向相鄰葉子節點的指針,它的最後一個數據會指向下一個葉子節點的第一個數據,造成了一個有序鏈表的結構。

  • 它是根據左閉右開的區間來檢索數據的 按照B+樹的特色,咱們能夠畫出一個存儲數據的簡圖,以下:

image.png

最後

2020年在匆匆忙忙慌慌亂亂中就這麼度過了,咱們迎來了新一年,互聯網的發展如此之快,技術突飛猛進,更新迭代成爲了這個時代的代名詞,堅持下來的技術體系會愈來愈健壯,JVM做爲現在是跳槽大廠必備的技能,若是你還沒掌握,更別提以後更新的新技術了。

更多JVM面試整理:

點擊這裏免費下載「百萬級」「JVM筆記」

相關文章
相關標籤/搜索