MySQL InnoDB引擎資料儲存行格式

2021-10-13 13:00:49 字數 2865 閱讀 7079

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

show variables like

'innodb_page_size'

=>

16384

頁中儲存著多行資料,innodb引擎資料的儲存格式也就是行格式有四種:

compactredundantdynamiccompressed

建立表時指定行格式:

不定長字段長度列表記錄了所有列中的不定長度的列的長度列表,比如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 flag

1標記此行資料是否被刪除

cmin_rec_flag

1如果是b樹的非葉子節點,每層的最小記錄(樹最左邊)節點會新增該標記

dn_owned

4每個頁中要給所有的資料行分組,分組中的最大行裡面標記當前組中有多少行,組中其他的行n_owned為0

eheap_no

13當前行在頁面堆中的相對位置

frecord_type

3表示當前記錄的型別,0位普通記錄,1為非葉子節點,2為infimum記錄,3為supremum記錄

gnext_record

16表示一下條記錄的相對位置

row_id

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

trx_id

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

roll_pointer

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

字段長度偏移列表

與compact的不定長字段長度列表的區別是,後者是逆序依次記錄變長字段的實際長度,而前者是逆序的所有列的偏移長度,比如有三個列,對應偏移量列表20 15 5那麼第乙個欄位的長度為5第二個的為10第三個的為5(逆序取差值)

null值列表

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

頭資訊

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

aabcddddeeeeeeeeeeeeeffffffffffghhhhhhhhhhhhhhhh編號

名稱大小(位數)描述a

預留位2

暫時沒有使用

bdeleted flag

1標記此行資料是否被刪除

cmin_rec_flag

1如果是b樹的非葉子節點,每層的最小記錄(樹最左邊)節點會新增該標記

dn_owned

4每個頁中要給所有的資料行分組,分組中的最大行裡面標記當前組中有多少行,組中其他的行n_owned為0

eheap_no

13當前行在頁面堆中的相對位置

fn_field

10資料中的列的數量

g1byte_offs_flag

10代表字段長度偏移列表每個列佔2個位元組,1時佔乙個位元組

hnext_record

16表示一下條記錄的相對位置

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

show variables like

'%row_format%'

=> dynamic

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

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

mysql InnoDB儲存引擎

innodb的組成部分 1.後台執行緒 2.儲存引擎記憶體池 innodb儲存引擎記憶體緩衝池 1.記憶體緩衝池 innodb是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。因此,可將其視為基礎磁碟的資料庫系統。在資料庫系統中,由於cpu速度與磁碟速度之間的紅狗,基於磁碟的資料庫系統通常使用緩...

Mysql Innodb儲存引擎

鎖 參考資料 參考資料 行鎖 innodb的鎖是對索引加鎖,如果查詢到並沒有用到索引就會對錶進行加鎖 record lock 對單條記錄加上鎖 gap lock 間隙鎖,鎖定乙個範圍,但是不包含記錄本身 next key lock record lock gap lock,鎖定乙個方位並鎖定記錄本身...

MYSQL INNODB 儲存引擎

innodb 是事務安全的mysql儲存引擎,設計上採用了類似於oracle的架構。一般而言,在oltp的應用中,innodb應該作為核心應用表的首選儲存引擎。同時,也是因為innodb的存在,才使得mysql變得更有魅力。第一 innodb儲存引擎概述 innodb由innobase oy 公司開...