1. 程式人生 > 其它 >MySQL InnoDB引擎資料儲存行格式

MySQL InnoDB引擎資料儲存行格式

技術標籤:mysqlmysql

mysql基本儲存單元是頁,是伺服器與磁碟互動的最小單位,預設大小16k,檢視頁大小:

show variables like 'innodb_page_size'   =>16384

頁中儲存著多行資料,InnoDB引擎資料的儲存格式也就是行格式有四種:
COMPACT REDUNDANT DYNAMIC COMPRESSED
建立表時指定行格式:

CREATE TABLE XXX (XXX) ROW_FORMAT=COMPACT;

COMPACT行格式:

在這裡插入圖片描述

不定長欄位長度列表
記錄了所有列中的不定長度的列的長度列表,比如varchar(255),text,blob型別都是不定長度的,這個不定長度確切指的是位元組而非字元,所以就算是char(10),當字符集為utf8時,位元組長度在10-30之間,也是不定長的.比如有abc三個列,A型別varchar(10),B型別Int(11),C型別char(10) utf8,此時不定長欄位長度列表裡面就會記錄A和C列的長度分別是多少,並且逆序存放,也就是存放C A列的長度,注意,如果不定長欄位值為null,那麼不會改列的長度.

NULL值列表
首先看有多少個可以為null的列,如果有三個的話,就以一個位元組來表示,位元組前5位補0,後三位就代表是這三個列是否為null,值為1就是null,值為0就是非null

頭資訊
compact頭資訊是固定5個位元組組成,也就是40位,不同位有這不同的意思,如下圖所示
aabcddddeeeeeeeeeeeeefffgggggggggggggggg

編號名稱大小(位數)描述
a預留位2暫時沒有使用
bdeleted flag1標記此行資料是否被刪除
cmin_rec_flag1如果是B樹的非葉子節點,每層的最小記錄(樹最左邊)節點會新增該標記
dn_owned4每個頁中要給所有的資料行分組,分組中的最大行裡面標記當前組中有多少行,組中其他的行n_owned為0
eheap_no13當前行在頁面堆中的相對位置
frecord_type3表示當前記錄的型別,0位普通記錄,1為非葉子節點,2為Infimum記錄,3為Supremum記錄
gnext_record16表示一下條記錄的相對位置

ROW_ID
如果表中沒有指定主鍵,那麼會找一個不允許為null的unique鍵做為主鍵,如果都沒有,innodb就會自己為生成一個ROW_ID的隱藏列作為主鍵,否則不會生成這列.

TRX_ID
最新對該行記錄進行更改的事務ID

ROLL_POINTER
回滾指標,指向更改之前的操作,用來事務進行回滾.

REDUNDANT行格式:

在這裡插入圖片描述
欄位長度偏移列表
與COMPACT的不定長欄位長度列表的區別是,後者是逆序依次記錄變長欄位的實際長度,而前者是逆序的所有列的偏移長度,比如有三個列,對應偏移量列表20 15 5

那麼第一個欄位的長度為5第二個的為10第三個的為5(逆序取差值)

NULL值列表
沒有NULL值列表,是否為null值儲存在欄位長度偏移量的各個欄位值二進位制首位,為1時代表欄位為null

頭資訊
redundant頭資訊是固定6個位元組組成,也就是48位,不同位有這不同的意思,如下圖所示
aabcddddeeeeeeeeeeeeeffffffffffghhhhhhhhhhhhhhhh

編號名稱大小(位數)描述
a預留位2暫時沒有使用
bdeleted flag1標記此行資料是否被刪除
cmin_rec_flag1如果是B樹的非葉子節點,每層的最小記錄(樹最左邊)節點會新增該標記
dn_owned4每個頁中要給所有的資料行分組,分組中的最大行裡面標記當前組中有多少行,組中其他的行n_owned為0
eheap_no13當前行在頁面堆中的相對位置
fn_field10資料中的列的數量
g1byte_offs_flag10代表欄位長度偏移列表每個列佔2個位元組,1時佔一個位元組
hnext_record16表示一下條記錄的相對位置

列溢位

如果列過大,如Blob,varchar,text等,一個頁都儲存不了(實際一個頁至少要儲存兩條記錄),就要用新的頁去儲存多出來的資料,針對這種大型別,COMPACT與REDUNDANT行格式,只會儲存該列的前768個位元組的資料以及一個指向溢位頁(儲存列多出來的資料的頁)的地址.

DYNAMIC行格式(預設)

show variables like '%row_format%' => dynamic

與COMPACT相比只是溢位列不再儲存前768位元組,而是隻儲存溢位頁的地址

COMPRESSED行格式

與COMPACT相比只是溢位列不再儲存前768位元組,而是隻儲存溢位頁的地址,並且會採用壓縮演算法對頁面進行壓縮.