1. 程式人生 > 實用技巧 >MySQL索引資料結構

MySQL索引資料結構

MySQL索引資料結構


索引是幫助MySQL高效獲取資料的 排好序資料結構
資料結構演示地址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

1.二叉樹

在這裡插入圖片描述
在這裡插入圖片描述
    左邊節點小於右邊節點,主鍵自增時變成連結串列結構

2.紅黑樹(平衡二叉樹)

在這裡插入圖片描述
    資料量很大時,這顆樹會異常龐大(樹高問題)

3.B Tree

  • 所有索引元素不重複
  • 節點中的索引從左往右遞增
  • 葉子節點之間的沒有指標,區別於B+樹
  • data儲存的是資料對應的磁碟地址, k-v結構
    在這裡插入圖片描述
    在這裡插入圖片描述

4.B+Tree(B Tree變種,MySQL使用的索引結構)

  • 非葉子節點不儲存data,只儲存索引(冗餘),可以放更多的索引
  • 葉子節點包含所有索引欄位
  • 葉子節點用雙向指標連線,提高區間訪問的效能
    在這裡插入圖片描述
    計算3層高的B+Tree能儲存多少資料結構:
        假設是索引是BigInt型別的資料,BigInt 佔 8個位元組 ,同時還是用6個位元組儲存了它指向的資料的實體地址;MySQL在使用innodb引擎的時候頁大小預設是16K,假設樹高為3,第一層即可以儲存 16KB * 1024 / (8B + 6B) = 1170(只存索引),第二層也是1170*1170 (第二層不是葉子結點,只存索引,不儲存資料),第三層,儲存資料,一般情況下一行資料的大小肯定不會超過1KB,就按照1KB,
    3層高的B+Tree , 儲存BitInt可以儲存 1170 * 1170 * 16 = 2千1 百萬

5.Hash表

  • 對索引的key進行一次hash計算就可以定位出資料儲存的位置
  • 很多時候Hash索引要比B+ 樹索引更高效
  • 僅能滿足 “=”,“IN”,不支援範圍查詢
  • hash衝突問題

6.MyISAM索引檔案和資料檔案是分離的(非聚集)

    MyISAM儲存引擎的索引檔案 MYI 和資料檔案 MYD 是分離的(非聚集),這就是非聚簇索引的含義
在這裡插入圖片描述
    如下圖可以看出MyISAM的索引檔案僅僅儲存資料記錄的地址。
    在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重複。

在這裡插入圖片描述

7.InnoDB索引實現(聚集)

  • 表資料檔案本身就是按B+Tree組織的一個索引結構檔案,ibd檔案就是資料和索引,這兩個儲存在一個檔案中 在這裡插入圖片描述
  • 主鍵索引:葉子節點包含了完整的資料記錄
    在這裡插入圖片描述
  • 輔助索引(二級索引):data儲存的是相應記錄主鍵的值而不是地址
    在這裡插入圖片描述

問題

1、為什麼建議InnoDB表必須建主鍵,並且推薦使用整型的自增主鍵?
    因為InnoDB的資料檔案本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含欄位作為主鍵,這個欄位長度為6個位元組,型別為長整形。
2、為什麼非主鍵索引結構葉子節點儲存的是主鍵值?(一致性和節省儲存空間)

8.聯合索引資料結構

在這裡插入圖片描述