innodb索引實現原理

2021-09-25 16:59:02 字數 1135 閱讀 7522

首先,我們來看一下簡單的查詢,我們首先想到的是全盤掃瞄,但是在這種方法下,效率是很低的。

這個時候,我們發現在頁(mysql管理儲存空間的基本單位)的七個組成部分中

(file helper:用來記錄頁的上下文,

page helper:資料也的儲存狀態,比如一共有多少條資料,槽,第一條的位址是什麼,

infinum +supernum:用來儲存兩條虛擬記錄,最大記錄和最小記錄:

user resource:真實資料儲存位置,

free space:頁面還沒有使用到的地方,是將來的user resource,

page directory:大小不確定,是頁面的槽的數量,當插入的數值越多,占用的空間越多,是記錄的相對位置。

file trailer:用來檢驗當從磁碟讀取資訊到記憶體是資訊是否完整。)

槽可以用來對資訊的查詢,進行二分查詢,但是只能是通過主鍵進行,因為在頁中,記錄是會安裝主鍵來進行排序來儲存的。

當記錄非常多的時候,頁的數量也非常多,我們需要建立目錄,目錄的內容應該包括當前頁的最小的記錄和頁的號碼,但是我們應該怎麼儲存目錄呢????

我們想到頁儲存記錄和目錄儲存頁的格式是一樣的,所以我們通過想資料頁一樣儲存目錄。值得一提的是,這個目錄也就是我們通常所說的索引。

因為目錄符合b+樹

(鍵值從小到大排列,這包括三個方面

1.頁內的記錄主鍵從小到大排列

2.儲存記錄的頁也要根據頁中記錄的主鍵大小進行乙個雙向鍊錶

3.儲存目錄的頁也要根據頁中記錄的主鍵大小進行乙個雙向鍊錶

葉子節點包括所有資訊

)模式,所以我們可以通過二分查詢,滿足這兩個特性的b+書叫做聚簇索引

這個時候問題來了,當我們要查詢其他列,沒有排序的時候怎麼辦,這個時候我們會建立乙個新的b+樹,但是這個b+樹不是聚簇索引,而是二級索引,特性和聚簇索引的差別有

(葉子節點沒有包含全部的資訊,只有查詢列和主鍵

使用查詢列進行排序

目錄項不再是主鍵+頁號,而是查詢列+頁號

)當我們需要查詢多列的時候,就是聯合查詢(葉子節點由查詢列和頁號組成,排序先按第一列排,當第一列相同時再按第二列排,以此類推。)

innodb記錄儲存結構

innodb資料頁結構

mysql的索引實現

關於索引的一些問題

InnoDB索引實現

1 innodb的資料檔案本身就是索引檔案。從上文知道,myisam索引檔案 是分離的,索引檔案僅儲存資料記錄的位址。而在innodb中,表資料 檔案本身就是按b tree組織的乙個索引結構,這棵樹的葉節點data域 儲存了完整的資料記錄,這個索引的key是資料表的主鍵,因此innodb 表資料檔案...

Innodb儲存引擎索引的實現原理

在查詢當中,如果是通過主鍵來查詢資料,即使用explain分析sql的key顯示primary時,查詢效率是最高的,因為葉子節點存放的就是資料記錄本身,所有可以直接返回,而不需要像非聚簇索引一樣需要通過額外的隨機磁碟訪問獲取資料記錄。其次是對於order by排序操作,如果order by的列是主鍵...

Mysql資料庫索引原理 InnoDB索引實現

innodb使用b tree作為索引結構 例如有這麼乙個表資料 col1為主鍵 在innodb中,表資料檔案本身就是按b tree組織的乙個索引結構,這棵樹的葉結點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。圖1圖1是innodb資料檔案...