深入剖析mysql索引機制
- 一、儲存引擎MyIsam/InnoDB
MySQL資料庫的儲存引擎有MyIsam和InnoDB兩個,MyIsam索引和資料分離,是天生非聚簇索引,InnoDB資料和索引在一起,資料檔案本身就是主鍵索引檔案,這樣的索引被稱為聚簇索引。直接反應在檔案系統中,MyIsam儲存引擎中每個資料表有三個檔案.frm、.MYD和.MYI,其中.frm是表定義檔案,.MYD是資料檔案,.MYI則是索引檔案。InnoDB只有兩個檔案.frm和.ibd,.frm是表定義檔案,資料和索引則統一存放在.ibd中。
二、索引資料結構B+Tree
索引是為了加速對錶中資料行的檢索而建立的一種分散儲存的資料結構,索引能極大的減少儲存引擎需要掃描的資料量,可以幫助我們在進行分組、排序等操作時避免使用臨時表。
MySQL資料庫的索引資料結構為B+Tree,B+Tree是多路絕對平衡查詢樹,所有葉子節點高度相同。B+Tree具有如下優點:
1、B+節點關鍵字個數與子節點個數是1:1關係;
2、B+非葉節點不儲存資料相關資訊,只儲存關鍵字和子節點的引用;
3、B+關鍵字對應的資料儲存在葉子節點中;
4、B+葉子節點是順序排列的,並且相鄰節點具有順序引用的關係。
由於B+Tree出色的資料結構,所有采用B+Tree作為索引資料結構,可以減少磁碟IO次數,提高磁碟讀寫能力,使得查詢效率也更加的穩定。
三、MySQL執行機制
四、MySQL中B+Tree索引體現形式—MyIsam
如下圖所示,以主鍵id和欄位name分別建立兩個索引,B+Tree資料結構中非葉子節點存放索引關鍵字和子節點引用,葉子節點中存放的是資料指標/磁碟地址。通過關鍵字查詢B+Tree獲取資料指標/磁碟地址,然後根據指標/磁碟地址訪問目標資料。
五、MySQL中B+Tree索引體現形式—InnoDB
如下圖所示,InnoDB中索引和資料存放在一起,以主鍵為索引組織資料儲存,葉子節點包括所有資料。欄位name的建立索引後怎麼進行資料檢索呢,其實只要知道其它索引(輔助索引)B+Tree葉子節點存放的內容就能一目瞭然,由於其它索引(輔助索引)B+Tree葉子節點存放的是資料主鍵,所以檢索到主鍵後,還需要再檢索一遍主鍵索引,才能找到目標資料。