innoDB是按照頁為單位讀寫的
那頁中有很多行數據,是怎么執行查詢的呢,首先我們肯定,是以單向列表形式存儲的,提高了增刪的效率,但是查詢效率低。所以實際上對頁中的行數據進行了優化,能以二分的方式進行查詢,執行這一操作的機制叫做頁目錄,在頁的內部建立分組(包括最大和最小記錄,但不包括被刪除了的記錄)。按照從小到大順序排列,每組的最大的記錄的頭信息(file_header)存儲著本組記錄的數量(見粉紅色字段)。頁目錄存儲的是最后一條記錄的地址偏移量(槽、slot,相當于頁目錄有個指針,指向每個組的最后一條記錄)。所以二分就能根據每個slot的最大值判定當前查詢應該去哪個分組。
然后我們抽象到更高層次,頁如何被查詢的?其實B+樹的每個節點都是一頁,只不過非葉子節點的數據是指針。葉子節點才是真的數據。
然后索引又分為聚簇索引和二級索引。
聚簇索引一般是主鍵索引,如果沒有主鍵就選不包含NULL值得唯一列,如果還沒有MySQL會創建一個隱藏的自增id列當作聚簇索引。聚簇索引葉子節點存的是真實數據。
二級索引就是建立的索引,葉子節點存放的是主鍵值,也就是說用了二級索引,查到后,還要用查到的主鍵值再查一遍聚簇索引才能獲取數據結果,這個過程叫做回表。但假如你要查的就是主鍵,那就只查一次即可。