【MySQL】mysql索引結構及其原理


1、定義

索引是一種數據結果,幫助提高獲取數據的速度

為了提高查找速度,有很多查詢優化算法。但是每種查找算法都只能應用於特定數據結構之上。

索引就是數據庫創建的滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據

2、索引數據結構

目前大部分數據庫系統及文件系統都采用B Tree或其變種B+Tree作為索引結構

相關概念介紹

  • B-樹(B樹):多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字范圍的子結點;所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
  • B+樹:在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中;
  • B*樹:在B+樹基礎上,為非葉子結點也增加鏈表指針,將結點的最低利用率從1/2提高到2/3;

3、為什么使用B Tree(B+Tree)

紅黑樹也可用來實現索引,但是文件系統及數據庫系統普遍采用B/+Tree,為什么?

一般來說,索引本身也很大,不可能全存內存,往往以索引文件的形式存在磁盤

 (1)單節點能存儲更多數據,使得磁盤IO次數更少。

 (2)葉子節點形成有序鏈表,便於執行范圍操作。

 (3)聚集索引中,葉子節點的data直接包含數據;非聚集索引中,葉子節點存儲數據地址的指針。

4、索引分類

1.普通索引index :加速查找

2.唯一索引

    主鍵索引:primary key :加速查找+約束(不為空且唯一)

    唯一索引:unique:加速查找+約束(唯一)

3.聯合索引

    -primary key(id,name):聯合主鍵索引

    -unique(id,name):聯合唯一索引

    -index(id,name):聯合普通索引

5、聚集索引和非聚集索引

聚集索引和非聚集索引使用的都是B+樹結構。

1、非聚集索引

非聚集索引的葉子節點為索引節點,但是有一個指針指向數據節點。

MyISAM是非聚集索引。

2、聚集索引

聚集索引葉子節點就是數據節點。

關於聚集索引,innodb會按照如下規則進行處理: 
  1,如果一個主鍵被定義了,那么這個主鍵就是作為聚集索引 
  2,如果沒有主鍵被定義,那么該表的第一個唯一非空索引被作為聚集索引 
  3,如果沒有主鍵也沒有合適的唯一索引,那么innodb內部會生成一個隱藏的主鍵作為聚集索引,這個隱藏的主鍵是一個6個字節的列,改列的值會隨着數據的插入自增。
 

innodb的普通索引,唯一索引,聯合索引都是輔助索引,采用非聚集索引結構。InnoDB的所有輔助索引都引用主鍵作為data域。

聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM