關於InnoDB表資料和索引資料的儲存
阿新 • • 發佈:2018-12-22
來自Mysql官方的說明
- 來看官方文件中對InnoDB的介紹,地址是:https://dev.mysql.com/doc/refman/5.5/en/innodb-introduction.html
上圖紅框中表明,InnoDB表資料的儲存是按照主鍵的值來組織的;
- 下圖資訊表明聚簇索引儲存了資料行,搜尋索引就能直接找到行資料,地址是:https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html
我的疑問
按照上面的說法,InnoDB表的聚簇索引在同一個結構中儲存了B-Tree索引和資料行,瞭解這個知識點後,我的疑問是:既然索引中有整行記錄,那麼表資料檔案還有什麼用呢?
來自《高效能MySql》的解釋
《高效能MySql》的5.3.5章節對於聚簇索引的描述:
- 聚簇索引並不是一種單獨的索引型別,而是一種資料資料儲存方式;
- 當表有聚簇索引是,它的資料行實際上存在放在索引的葉子頁(leaf page)中;
- 葉子頁包含了行的全部資料;
看來我的疑問可以解釋了:索引資料和表資料分開儲存這種理解在InnoDB是錯誤的,實際上InnoDB的表資料儲存在主鍵索引的B-Tree的葉子節點;
再來看看大神文章中的解釋;
Jeremy Cole的解釋
- Jeremy Cole的個人資訊介紹:https://blog.jcole.us/about-me/
- 來看看儲存索引和資料的idb檔案的結構,如下圖:
從上圖可見,並不存在表資料這樣的內容,只有節點頁(Node pages)和葉子頁(Leaf pages) - 關於節點頁和葉子頁的詳情,以及每個聚簇索引結構體內容的詳情,請看Jeremy Cole部落格的圖片集,地址是:https://github.com/jeremycole/innodb_diagrams
- 重點來了,大神有句簡單的小結:Everything is an index in InnoDB,如下圖所示,綠框中指出表資料儲存在主鍵索引的結構圖中,地址在:https://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/
反思
- 向資料庫新增一條記錄會儲存索引資料和表資料,但並不代表會分別寫索引檔案和表資料檔案,以前犯的是想當然錯誤;
- 之前的疑問是"索引檔案中有資料行,那表資料檔案有啥用",沒有放過這個疑問,而是去刨根問底,終於有所收穫;
- 雖然搜尋一些中文文章也有答案,但搜尋權威著作或者大神文章,能把問題理得更清晰,而且通過翻閱相關的目錄和章節還能獲得更全面的答案;