MySQL innodb 資料頁結構分析

2022-08-17 06:51:07 字數 1395 閱讀 8382

頁(page)是 innodb 儲存引擎用於管理資料的最小磁碟單位。常見的頁型別有資料頁、undo 頁、系統頁、事務資料頁等,本文主要分析的是資料頁。預設的頁大小為 16kb,每個頁中至少儲存有 2 條或以上的行記錄,本文主要分析的是頁與行記錄的資料結構,有關索引和 b-tree 的部分在後續文章中介紹。

user records 中存放的是實際的資料行記錄,具體的行記錄結構將在本文的第二節中詳細介紹。free space 中存放的是空閒空間,被刪除的行記錄會被記錄成空閒空間。page directory 記錄著與二叉查詢相關的資訊。file trailer 儲存用於檢測資料完整性的校驗和等資料。

innodb 儲存引擎提供了兩種格式的行記錄:compact 和 redundant。

變長字段長度列表:逆序記錄每乙個列的長度,如果列的長度小於 255 位元組,則使用乙個位元組,否則使用 2 個位元組。該字段的實際長度取決於列數和每一列的長度,因此是變長的。

null 標誌位:乙個位元組,表示該行是否有 null 值(此處有疑問,8位,最多只能表示 8 列?)

列資料部分:除了記錄每一列對應的資料外,還有隱藏列,它們分別是 transaction id、roll pointer 以及 row_id(當沒有指定主鍵)。

注意:此處需要注意固定長度 char 資料型別和變長 vchar 資料型別在 compact 記錄下為 null 時不占用任何儲存空間。

字段長度偏移列表:與 compact 中的變長字段長度列表相同的是它們都是按照列的逆序順序設定值的,不同的是字段長度偏移列表記錄的是偏移量,每一次都需要加上上一次的偏移,同時對於 char 的 null 值,會直接按照最大空間記錄,而對於 vchar 的 null 值不占用任何儲存空間。

注意:此處需要注意 vchar 型別和 char 型別在建表時傳入的引數是字元長度而不是位元組長度,實際的位元組長度需要跟編碼方式相關聯,例如 utf-8 乙個中文字元需要 3 位元組來表示,這樣 char(10) 以 utf-8 來表示的話,它的位元組長度在 10 - 30 之間。

我們知道資料頁的大小是 16kb,innodb 儲存引擎保證了每一頁至少有兩條記錄,如果一頁當中的記錄過大,會擷取前 768 個位元組存入頁中,其餘的放入 blob page。

Mysql InnoDB資料頁結構

官方名字 索引頁 所以你知道了,user records 和 free space 之間是此消彼長的關係 簡化下,因為變長字段長度列表,null值列表都沒什麼用 所以儲存記錄為 delete mask 標記是否刪除了 heap no 記錄的序號,序號為0的記錄是infimum,序號1為spuermu...

Mysql InnoDb資料頁的組成及記錄維護

一 mysql innodb資料頁的組成,單頁資料頁的大小為16kb,由以下七部分組成 2.資料頁頭 記錄頁面的控制資訊。大小是56個位元組,包括頁的左右兄弟頁面指標 雙向鍊錶 頁面的空間使用情況。3.虛記錄 最大虛記錄和最小虛記錄。4.記錄堆 行記錄儲存區,分為有效記錄和已刪除記錄 自由空間鍊錶 ...

Mysql InnoDB引擎的索引與儲存結構詳解

前言 在oracle 和sql server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。而mysql資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。mysql主要儲存引擎的區別 mysql預設的儲存引擎是my...