MySQL學習記錄之行格式與頁格式

2021-10-17 08:13:47 字數 3433 閱讀 1515

之前的文章已經提過了在bufferpool中,是按照頁的形式來存放的。但是資料在表中是一行行的儲存的,那麼這些資料又是怎樣的格式?

記錄在磁碟上的存放方式被稱為行格式,innodb儲存引擎中有4種不同型別的行格式,compact、redundant、dynamic和compressed。

指定行格式

create table 表名 (列的資訊) row_format=行格式名稱

alter table 表名 row_format=行格式名稱

上圖是compact行格式的示意圖,一條記錄可分為兩部分,一部分是記錄的額外資訊,一部分是記錄的真實資料,也就是具體存放的字段內容

變長字段如何儲存

資料庫中除了integer、char這樣的定長字段,還會有varchar、text這樣長度不固定的字段。這些資料最終儲存在磁碟上的時候,是一大坨資料放在一起儲存的。那麼就有乙個問題,如何把這些變長字段取出來,你至少得知道哪個欄位是變長,每個變長字段的長度是多少!

mysql> create table record_format_demo (

-> c1 varchar(10),

-> c2 varchar(10) not null,

-> c3 char(10),

-> c4 varchar(10)

-> ) charset=ascii row_format=compact;

query ok, 0 rows affected (0.03 sec)

比如如上的乙個表,插入如下的資料

mysql> select * from record_format_demo;

+------+-----+------+------+

| c1 | c2 | c3 | c4 |

+------+-----+------+------+

| aaaa | bbb | cc | d |

| eeee | fff | null | null |

+------+-----+------+------+

2 rows in set (0.00 sec)

如上乙個表,只有c3列的資料是定長10個位元組,其他的字段是按照實際的儲存長度儲存的。

那麼第一條資料在儲存的時候就是這樣存的,注意儲存變長地段是按照逆序儲存的

0x01 0x03 0x04 null值列表 記錄頭資訊 aaaa bbb cc d
null值如何儲存

一句話,null值列表以二進位制bit位來儲存,空為1,非空為0,這樣第一行的儲存我們就可以進一步完善一下

0x01 0x03 0x04 0000 記錄頭資訊 aaaa bbb cc d
記錄頭資訊

記錄頭資訊共有40個bit位,也就是8個位元組

名稱大小(單位:bit)

描述預留位11沒有使用

預留位21沒有使用

delete_mask1標記該記錄是否被刪除

min_rec_mask1b+樹的每層非葉子節點中的最小記錄都會新增該標記

n_owned4表示當前記錄擁有的記錄數

heap_no13表示當前記錄在記錄堆的位置資訊

record_type3表示當前記錄的型別,0表示普通記錄,1表示b+樹非葉子節點記錄,2表示最小記錄,3表示最大記錄

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

記錄的真實資料

除了上邊的這些欄位外,實際儲存一條資料的時候還會加入一些隱藏字段

列名是否必須

占用空間

描述db_row_id

6位元組

行id,唯一標識一條記錄

db_trx_id

6位元組

事務id

db_roll_ptr

7位元組

回滾指標

如果我們沒有指定主鍵,內部就會自動加乙個row_id作為主鍵。剩下兩個字段主要是跟事務相關的,這個後面再提。

行溢位每個頁的大小是16kb,假如一行的資料超過了頁的大小了會發生什麼?

資料頁,就是平時執行crud的時候,從磁碟上載入資料頁到bufferpool的快取頁中,然後更新快取頁,再重新刷回到磁碟中。

名稱中文名

占用空間大小

簡單描述

file header檔案頭部

38位元組

頁的一些通用資訊

page header頁面頭部

56位元組

資料頁專有的一些資訊

infimum + supremum最小記錄和最大記錄

26位元組

兩個虛擬的行記錄

user records使用者記錄

不確定實際儲存的行記錄內容

free space空閒空間

不確定頁中尚未使用的空間

page directory頁面目錄

不確定頁中的某些記錄的相對位置

file trailer檔案尾部

8位元組

校驗頁是否完整

MySQL之行程與使用者

問題重述 trips 表中存所有計程車的行程資訊。每段行程有唯一鍵 id,client id 和 driver id 是 users 表中 users id 的外來鍵。status 是列舉型別,列舉成員為 completed cancelled by driver cancelled by clie...

mysql學習記錄 MySQL學習記錄 2

in 子查詢 select from student where id in 1,2 not in 不在其中 select from student where id not in 1,2 is null 是空 select from student where age is null is not...

03 Mysql資料庫之 行記錄 詳細操作

在mysql管理軟體中,可以通過sql語句中的dml語言來實現資料的操作,包括 使用insert實現資料的插入 update實現資料的更新 使用delete實現資料的刪除 使用select查詢資料以及 插入資料insert 插入完整資料 順序插入 語法一 insert into 表名 欄位1,欄位2...