深刻理解Mysql索引底層數據結構與算法

索引的定義:索引(Index)是幫助MySQL高效獲取數據的數據結構。mysql

Q1:你們使用索引有沒有想過這個問題?爲何索引可以幫助mysql高效獲取數據?我一一給你們道來!在給你們講以前,先更你們分享一些計算機基礎知識,有助於理解算法

A:1:MySQL的數據都是以文件的形勢存儲在磁盤上的。sql

      2:磁盤是由一圈一圈的磁道組成。數據結構

      3:磁頭移動到不一樣的磁道,磁盤旋轉,這樣就能夠讀到數據。性能

  4:磁盤存取原理 1.尋道時間(速度慢,費時)  2.旋轉時間(速度較快)
mysql索引

  5:CPU讀取數據都是從內存讀取,內存去磁盤中讀取數據,內存讀取磁盤數據大小都是以頁的大小單位。一頁 = 10kb
spa

  

      總結:1:當磁頭移動到另外一個磁道讀取數據就是咱們常說的一次I/O操做,MySQL數據是分佈在不一樣的磁道上的,每次讀取數據都要把全部的磁道讀取一遍。設計

                 那咱們進行I/O操做的次數就不少了,查詢效率就很低。3d

      2:索引就是把索引字段數據的地址保存起來,來幫助MySQL直接定位到哪一個磁道哪一個扇區,這樣就減小了I/O的操做次數了,天然查詢效率就提升了。指針

  

  Q2:數據結構那麼多,mysql索引爲何要用B+Tree數據結構,而不是其餘呢?確定其餘的數據不知足咱們的要求

         常見的數據結構:

             1:二叉樹

     2:紅黑樹

        3:hash

     4: B  Tree

     5: B+Tree

 

    a.二叉樹

            二叉樹是n(n>=0)節點的有限集合,該集合或者爲空集(稱爲空二叉樹),或者由一個根節點和二棵不想交的,分別稱爲根節點的左子樹和右子樹組成。

      不使用緣由:一個節點只有一度,就是隻有一個子節點,那讀取樹的一層就是一次I/O操做,性能也很差。

    b.紅黑樹

             紅黑樹即爲平衡二叉樹的一種

      不使用緣由:一個節點有二個子節點,那就出現一層只有二個節點的狀況,這種性能也很差

    c.hash

      不使用緣由:Hash是把索引數據進行Hash算法對應一個地址,咱們會發現這個性能很好啊,直接找到可是咱們想一想,他能知足咱們平常大部分狀況麼?

            好比經過大於或小於篩選數據,因此說也不合適,固然MySQL也提供了Hash索引,畢竟有些場合用起來仍是不錯的

        d.B Tree

      1.度(Degree)-節點的數據儲存個數  2.葉節點具備相同的深度  3.葉節點的指針爲空  4.節點中的數據key從左到右遞增排列

       

           不使用緣由:雖然解決了每一層的節點數的極端狀況下,可是每個節點存儲了索引和數據,一層存儲的數據太多也很差,畢竟內存能讀取的數據大小就10kb.

    e.B+Tree

      1.B+Tree(B-Tree的變種)  2.非葉子節點不存儲data,只存儲key,能夠增大度  3.葉子節點不存儲指針  4.順序訪問指針,提升區間訪問性能

        

      使用緣由:設計有幾個方面

        1:非葉子節點不存儲data,只存儲key,能夠增大度

        2:葉子節點不存儲指針

        3:順序訪問指針,提升區間訪問的性能。

 

  三:B+Tree索引的性能分析

        .通常使用磁盤I/O次數評價索引結構的優劣。

   ..預讀:磁盤通常會順序向後讀取必定長度的數據(頁的整倍數)放入內存

  ..局部性原理:當一個數據被用到時,其附近的數據也一般會立刻被使用

  ....B+Tree節點的大小設爲等於一個頁,每次新建節點直接申請一個頁的空間,這樣保證一個節點物理上也存儲在一個頁裏,就實現了一個節點的載入只須要一次I/O

  .....B+Tree的度d通常會超過100個,所以h很是小(通常爲3到5之間)

 

  四:不一樣的存儲引擎,有不一樣的索引實現

     1:MyISAM索引實現(非彙集)   2.InnoDB索引實現(彙集)

 

    a.MyISAM索引實現(非彙集)

    ---->MyISAM索引文件與數據文件是分離的

      

 

    b.InnoDB索引實現(彙集)

      1:數據文件自己就是索引文件  2:表數據文件自己就是按B+Tree組織的一個索引結構文件  3:彙集索引-葉節點包含了完整的數據記錄

      4:爲何InnoDB表必須有主鍵,而且推薦使用整型的自增主鍵?  5:爲何非主鍵索引結構葉子節點存儲的是主鍵值?(一致性和節省存儲空間)

        

 

  五:聯合索引結構

  --->聯合索引的底層存儲結構長什麼樣?

 

  六:索引最左前綴原理

相關文章
相關標籤/搜索