InnoDB是一個將表中資料存盤到磁盤上的存盤引擎,即使我們關閉并重啟服務器,資料依然存在,InnoDB存盤引擎并不是一條一條的把記錄從磁盤上讀出,而是將資料劃分為若干個頁,以頁作為磁盤和記憶體之間互動的基本單位,
我們平時都是以記錄為單位向表中插入資料的,這些記錄在磁盤上的存放形式也被稱為行格式或者記錄格式,InnoDB存盤引擎現在已經有4種不同型別的行格式,分別是COMPACT、REDUNDANT、DYNAMIC、COMPRESSED,
主要講一下COMPACT行格式:
| 變長欄位長度串列 | NULL值串列 | 記錄頭串列 | 列1的值 | 列2的值 | ··· | 列3的值 |
|---|
一條完整的記錄可以成為記錄的額外資訊(變長欄位長度串列,NULL值串列,記錄頭串列)和記錄的真實資料(列1的值,列2的值,···,列3的值),
1.記錄的額外資訊
(1)變長欄位長度串列
MySQL支持一些變長的資料型別,比如VERCHAR(M),VARBINARY(M),各種TEXT型別,各種BLOB型別,變長位元組欄位存盤多少個位元組的資料是不固定的,所以我們在存盤真實資料的時候需要順便把這些資料占用的位元組頁存起來,
在COMPACT行格式中,所以變長欄位的真實資料占用的位元組數都存放在記錄的開頭位置,從而形成一個變長欄位長度串列,各變長欄位的真實資料占用位元組數按著列的順序逆序存放,
(2)NULL值串列
一條記錄的某些列可能為NULL值,COMPACT行格式把一條記錄中為NULL值的列統一管理起來,
1.首先統計表中允許存盤NULL值的列有哪些,
2.如果表中沒有允許存盤NULL值的列,則NULL值的串列也不存在了,否則將每個存盤NULL值得列對應一個二進制位,二進制位按著列的順序逆序排列,二進制表示的意義如下:
二進制位的值為1時,代表該列的值為NULL;
二進制位的值為0時,代表該列的值不為NULL;
3.MySQL規定NULL值必須用整數個位元組的位表示,如果使用的二進制位個數不是整個位元組數,則位元組的高位補0;
(3)記錄頭資訊
記錄頭的資訊由固定的5個位元組組成,用于描述一些屬性,
2.記錄的真實資料
記錄的真實資料除了我們自己定義的列的資料之外,MySQL會為每個記錄默認的添加一些列(也稱隱藏列),如下:
| 列名 | 是否必須 | 占用空間 | 描述 |
|---|---|---|---|
| row_id | 否 | 6位元組 | 行ID,唯一標識一條記錄 |
| trx_id | 是 | 6位元組 | 事務ID |
| roll_pointer | 是 | 7位元組 | 回滾指標 |
從表中可以看出,InnoDB存盤引擎會為每條記錄都添加rx_id和roll_pointer兩個列,但是row_id是可選的(在沒有自定義主鍵以及不允許存盤NULL值得UNIQUE鍵的情況下才會添加該列),
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/238120.html
標籤:其他
