mysql行格式 MySQL 行格式

2021-10-17 13:52:13 字數 2535 閱讀 1345

以 mysql 預設的儲存引擎 innodb 為例

innodb 包含以下四種行格式

compact

redundant

dynamic

compressed

指定行格式

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

alter table 表名 row_format=行格式名稱;

示例:建立一張表,指定行格式為 compact

create table test_table (

c1 varchar(10),

c2 varchar(10) not null,

c3 char(10),

c4 varchar(10)

charset=ascii row_format=compact;

行格式型別

compact

compact 中一條完整的記錄可以被分成 '記錄的額外資訊' 和 '記錄的真實資料' 兩部分

記錄的額外資訊

compact 中記錄的額外資訊包含三類:變長字段長度列表、null 值列表、記錄頭資訊

變長字段長度列表

mysql 支援一些變長的資料型別 (varchar),這些資料在儲存時不僅要儲存資料內容,還需要將占用的位元組數儲存起來

定長資料型別 (char) 在以一些變長字符集儲存資料時,由於儲存長度為變長,所以也需要在該列表中儲存其長度

在記錄的開頭部位就是各個變長字段占用的位元組數,這些資料逆序存放

如果表中沒有變長字段,就沒有變長字段長度列表

null 值列表

null 值列表儲存有表中所有 null 值,可以節約許多空間

值為 1 時,代表 null;值為 0 時,代表非 null。當位數不夠整數個位元組的時候,在高位補 0

所有資料逆序存放

如果表中沒有允許儲存 null 值的列,就沒有 null 值列表

記錄頭資訊

名稱大小 (bit)

描述預留位1

沒有使用

預留位2

沒有使用

delete_mask

標記該記錄是否被刪除

min_rec_mask

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

n_owned

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

heap_no

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

record_type

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

next_record

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

記錄的真實資料

隱藏列除了一些自定義列的資料外,mysql 還會為每個記錄預設新增一些隱藏列:

列名是否必須

占用空間 (bit)

描述db_row_id

否行id,唯一標識一條記錄

db_trx_id

是事務id

db_roll_ptr

是回滾指標

只有當使用者沒有指定主鍵,且表中沒有 unique 鍵時才會新增 db_row_id 作為主鍵

儲存資料

當定長資料型別 (char) 沒有儲存滿時,剩下的位都由空格 (0x20) 填滿

當使用變成字符集時,由於儲存位元組長度不一定,當占用位元組數少的字串變為占用位元組數多的字串時需要新開闢乙個空間,會產生儲存碎片

redundant

記錄的額外資訊

字段長度偏移列表

redundant 行格式會把該條記錄中所有列 (包括隱藏列) 的長度資訊都按照逆序儲存到 '字段長度偏移列表' 中

儲存的值為兩個相鄰數值的差值

所有資料逆序存放

記錄頭資訊

名稱大小 (bit)

描述預留位1

沒有使用

預留位2

沒有使用

delete_mask

標記該記錄是否被刪除

min_rec_mask

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

n_owned

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

heap_no

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

n_field

表示記錄中列的數量

1byte_offs_flag

標記字段長度偏移列表中每個列對應的偏移量是使用1位元組還是2位元組表示的

next_record

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

記錄的真實資料

儲存資料

不管該列使用的字符集是什麼,只要是使用 char 型別,占用的真實資料空間就是該字符集表示乙個字元最多需要的位元組數和字串長度

例如使用 utf8 字符集的 char(10) 列占用的真實資料空間始終是 30 個位元組

dynamic & compressed

mysql 8.0 中預設的行格式為 dymatic

這兩個行格式與 compact 只有在處理行溢位資料 (

compressed 與 dymatic 不同的一點是它會採用壓縮演算法對頁面進行壓縮,以節省空間

mysql 設定行格式 mysql行格式

最近用phpmyadmin,突然發現有個引數row format,以下是手冊中的解答部分,看了之後水平又提公升了,做個記錄。另外看了這部分之後發現原來mysql儲存變長資料的方法和檔案系統原來一樣啊,都是資料和索引分離,然後一堆碎片和鏈結,哈哈。紅色標出的部分比較重要,很少有人會去關注,提醒大家看下...

mysql行 《Mysql 行模式》

一 總結 預設的行格式定義 innodb default row format 檢視當前資料表行格式 show table status table 建立表指定行格式 create table table row format dynamic 修改錶行格式 alter table table row...

mysql 行格式 分割槽方式

innodb邏輯儲存結構 所有資料被邏輯地存放在表空間中,表空間又由段 區 頁 有些文件稱之為塊 行組成。段 常見的段有資料段 回滾段 索引段 與約束這種邏輯概念不同,索引是一種資料結構,不止有邏輯上的概念,在資料庫中還代表著物理儲存的方式。索引段即b 樹的非索引節點 等。innodb由自身完成對段...