1. 程式人生 > >關於InnoDB表資料和索引資料的儲存

關於InnoDB表資料和索引資料的儲存

來自Mysql官方的說明

  1. 來看官方文件中對InnoDB的介紹,地址是:https://dev.mysql.com/doc/refman/5.5/en/innodb-introduction.html
    在這裡插入圖片描述

上圖紅框中表明,InnoDB表資料的儲存是按照主鍵的值來組織的;

  1. 下圖資訊表明聚簇索引儲存了資料行,搜尋索引就能直接找到行資料,地址是:https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html
    在這裡插入圖片描述

我的疑問

按照上面的說法,InnoDB表的聚簇索引在同一個結構中儲存了B-Tree索引和資料行,瞭解這個知識點後,我的疑問是:既然索引中有整行記錄,那麼表資料檔案還有什麼用呢?

來自《高效能MySql》的解釋

《高效能MySql》的5.3.5章節對於聚簇索引的描述:

  1. 聚簇索引並不是一種單獨的索引型別,而是一種資料資料儲存方式;
  2. 當表有聚簇索引是,它的資料行實際上存在放在索引的葉子頁(leaf page)中;
  3. 葉子頁包含了行的全部資料;

看來我的疑問可以解釋了:索引資料和表資料分開儲存這種理解在InnoDB是錯誤的,實際上InnoDB的表資料儲存在主鍵索引的B-Tree的葉子節點;

再來看看大神文章中的解釋;

Jeremy Cole的解釋

  1. Jeremy Cole的個人資訊介紹:https://blog.jcole.us/about-me/
  2. 來看看儲存索引和資料的idb檔案的結構,如下圖:
    在這裡插入圖片描述
    從上圖可見,並不存在表資料這樣的內容,只有節點頁(Node pages)和葉子頁(Leaf pages)
  3. 關於節點頁和葉子頁的詳情,以及每個聚簇索引結構體內容的詳情,請看Jeremy Cole部落格的圖片集,地址是:https://github.com/jeremycole/innodb_diagrams
  4. 重點來了,大神有句簡單的小結:Everything is an index in InnoDB,如下圖所示,綠框中指出表資料儲存在主鍵索引的結構圖中,地址在:https://blog.jcole.us/2013/01/07/the-physical-structure-of-innodb-index-pages/

    在這裡插入圖片描述

反思

  1. 向資料庫新增一條記錄會儲存索引資料和表資料,但並不代表會分別寫索引檔案和表資料檔案,以前犯的是想當然錯誤;
  2. 之前的疑問是"索引檔案中有資料行,那表資料檔案有啥用",沒有放過這個疑問,而是去刨根問底,終於有所收穫;
  3. 雖然搜尋一些中文文章也有答案,但搜尋權威著作或者大神文章,能把問題理得更清晰,而且通過翻閱相關的目錄和章節還能獲得更全面的答案;