mysql索引存儲結構

索引

幫助MySQL高效獲取數據的排好序數據結構;

常見的索引結構

  • 二叉樹
  • 紅黑樹
  • hash
  • b-tree
  • b+tree索引真正使用的數據結構

二叉樹

缺點:一個節點只有兩個子節點,當數據量很大時,樹的深度很大,要進行多次查詢,而且容易造成兩邊不平衡。

紅黑樹

優點:解決了二叉樹不平衡的問題。
缺點:當數據量很大時 ,樹的深度還是很高。

hash

缺點:不能進行範圍查找。

b-tree

度(degree)- 節點的數據存儲個數
葉節點具有相同的深度
節點中的數據key從左到右遞增排列
優點:因爲度可以讓一個節點存儲多個數據,所以大大降低了樹的深度。
那是不是度越大越好呢?
答案:不是,當使用索引時,會把樹的節點數據從索引文件中讀取到內存中,這個讀取大小的單位和計算機有關,不過一定是頁(一般一頁是4k)的整數倍,如果一個節點的數據太大,就會多次向內存中加載數據,也就是進行多次IO操作,這是非常耗性能的。

b+樹

和b樹不同的是:

  1. b+樹非葉子節點中的數據是隻存儲key,不存儲數據,單個數據節點的大小減小,可以把樹的度設置的更大,從而減少查詢次數,提高查詢速度。
  2. b+樹葉子節點存儲key和value,從左到右升序排列,並且以指針相連,大大提高了範圍內查找的速度和效率。

索引實現

存儲引擎是設置在表級別的

Myisam索引實現(非聚集)

  • Myisam索引文件和數據文件分離
    在MySQL的data/mysql/目錄下一般一張表有三個文件:
    .frm:表結構文件
    .myd:數據文件
    .myi:索引文件
  • 索引文件葉子節點中value是數據在數據文件中的地址
  • 主鍵索引與非主鍵索引存儲方式相同

InnoDB索引實現(聚集)

  • InnoDB索引文件和數據文件放在一起
    在MySQL的data/mysql/目錄下一般一張表有二個文件:
    .frm:表結構文件
    .idb:索引文件和數據
  • InnoDB必須有主鍵,推薦是自增類型。如果沒有主鍵會自動從列中選一個列作爲主鍵,如果都不符合做主鍵的條件,則InnoDB會爲該表創建一個主鍵。
  • 主鍵索引中value是數據(可以理解爲一條記錄)
  • 非主鍵索引中value是主鍵索引中的主鍵。
  • 爲什麼非主鍵索引不和主鍵索引一樣value中放置數據呢?
    這就和事務有關了,如果value中都存儲數據,則進行更新和插入數據時,這兩個索引結構都要改變,而且還要實現事務的ACID特徵,不易實現,效率也不高。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章