懂不懂MySql索引,你內心沒點B樹嗎?

論數據庫索引的重要性?
java

看圖說話:數據庫沒加索引-龜速,數據庫加了索引-火箭的速度,能夠看出索引到底有多重要數據庫


那麼索引是什麼?微信


索引是用來快速檢索出具備特定值的記錄。數據結構

MySql官方對索引的定義爲:索引(index)是幫助MySql高效獲取數據的數據結構。學習


那麼MySQL到底是使用什麼樣的數據結構做爲索引呢?大數據

目前,咱們將探索以下三種數據結構,二叉查找樹、B-Tree、B+Tree
優化


1.  二分查找(二叉查找樹或者是二叉搜索樹)spa


下面咱們引出一個猜數字的問題.net


二分查找的時間複雜度是log2 N,表示以2爲底N的對數,32次能夠檢索21億的數據。指針


二叉查找樹的特色:

1. 若是它的左子樹不爲空,則左子樹上結點的值都小於根節點。

2. 若是它的右子樹不爲空,則右子樹上結點的值都大於根節點。

3. 子樹一樣也要遵循以上兩點。


爲何又叫作二叉排序樹呢?

只要一棵樹是二叉搜索樹,那麼它的中序遍歷必定是有序的。上面的那顆二叉樹的中序遍歷就是(左根右):0 3 4 5 6 8 10


二叉搜索樹和平衡二叉樹的關係:爲何會引出平衡二叉樹,就是說有了二叉樹,爲啥要有平衡二叉樹。


看下面這棵二叉搜索樹,若是我要查找10這個結點,是否是查找的結點要通過5 6 8 10這幾個結點,你們仔細看看,是否是5 6 8 10 這幾個結點從某種意義上講就變成了單向鏈表的結構,也就是說二叉搜索樹退化成了單向鏈表的結構,因此這時咱們引入了平衡樹的概念。



 什麼是平衡二叉樹?AVL樹 ,三個變化規則,變顏色,左旋和右旋 ,它也能夠叫作紅黑樹


紅黑樹的特色:

1. 節點必須是紅色或者黑色。

2. 根節點必須是黑色。

3. 葉節點(NIL)是黑色的。(NIL節點無數據,是空節點)

4. 紅色節點必須有兩個黑色兒子節點。

5. 從任一節點出發到其每一個葉子節點的路徑,黑色節點的數量是相等的。


紅黑樹:HashMap

不適合磁盤存儲的數據,也不適合存儲大量的數據,由於IO浪費太大,讀取的資源也浪費太大。HashMap爲何又要用呢?HashMap是在內存而不是磁盤。紅黑樹不能用做MySql的索引。


2. B-Tree(B樹)

    

B-Tree建立過程詳細介紹:


M階的B-Tree的幾個重要特性:

1)結點最多含有M顆子樹,最多含有m-1個關鍵字(數據)(m>=2)

2)除了根結點和葉子結點外,其餘每一個結點至少有ceil(m/2)個子結點,ceil爲上取整

3)若根結點不是葉子結點,則至少有兩顆子樹


例子:建立一個5階的B-Tree。插入的數據有:

3 14 7 1 8 5 11 17 13 6 23 12 20 26 4 16 18 24 25 19


1)根據B-Tree的特性,5階則一個磁盤空間最多有5個指針(存的查找路徑),4個關鍵字(MySql存的數據),具體的插入過程以下:


插入3

插入14

插入7

插入1

插入8,此時發現空間不足,這是會出現一個分裂,移動中間元素到根結點即獲得以下圖:

插入5

插入11,17

插入13:須要注意,此時B-Tree又會進行一次分裂,此次分裂須要注意下13會移動到根結點

後面的插入就不一一舉例了,本身驗證下,最後獲得以下圖所示的樹:


假如MySql存儲的數據放在以下圖所在的data中:

以上的Data就是真實的MySql的data,每一個結點都會存儲一個data,你們發現有沒有問題,其實它是有問題的,雖然解決了磁盤分頁的問題,由於每個結點會拉取不少的數據,可是仍是會浪費IO,它比紅黑樹節省空間不少。可是MySql仍是不會用它。


3. B+Tree(B+樹)MySql用的就是B+Tree

MySql終極解決方案就是:優化CPU+Mem+IO,因此就是使用B+Tree。


B+Tree的性質:

(1)每一個節點最多有M個子節點

(2)除根節點外,每一個節點至少有m/2個子節點,注意若是結果除不盡,就向上取整,好比5/2=3。

(3)根結點要麼是空,要麼是獨根,不然至少有2個子節點

(4)有k個子節點的節點必有k個關鍵碼

(5)葉節點的高度一致



下面咱們看一下B+Tree插入數據的過程:3階的B+Tree插入1四、17


插入14:

插入17

總結:


二叉查找樹、紅黑樹、B-Tree、B+Tree的區別:


二叉查找樹:二叉搜索樹,優勢查找快,可是在某些狀況下會退化成鏈表,它是全部高效查找樹的基礎,根本性的東西


紅黑樹:內存查找高效樹,不適合大數據量,也不適合磁盤存儲。具體的分析就是IO浪費,以及讀取資源浪費,還有就是樹的深度會很大。適合一些底層運算。


B-Tree: 能夠認爲是B+Tree的過渡。


B+Tree: 最適合大數據的磁盤存儲,經典的MySql,全部的數據都存儲在葉子節點。其餘的都是索引,增長了系統的穩定性以及遍歷、查找效率


B-Tree和B+Tree不一樣:關鍵字和key值,能夠參見數據結構圖,B+Tree的葉子節點增長了雙向鏈表。


M階:這個由磁盤的頁面大小決定,磁盤和頁內存都是4KB。咱們的節點數也就是咱們的M值,應該儘量和它保持一致。

本文分享自微信公衆號 - Java學習進階手冊(javastudyup)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索