論數據庫索引的重要性?
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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。