MySQL索引資料結構
阿新 • • 發佈:2020-10-23
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,
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、為什麼非主鍵索引結構葉子節點儲存的是主鍵值?(一致性和節省儲存空間)