mysql中行的格式類型包括:Compact、redundant、dynamic、compressed這四種,行和行之間是通過一個單向鏈表的形式來連接的,而我在實際工作中最常用到的是compact類型。
具體行的類型可以在create中看到,例如:
compact行類型又是由:記錄的額外信息和記錄的真實數據組成。
上圖中的前五項:
變長字段長度列表、NULL標志位、記錄頭信息組成了記錄的額外信息
列1數據、列2數據組成了記錄的真實數據
1.變長字段長度列表:存儲的是行中的變長類型在真實數據中的長度其中變長類型包括:varchar、text、blob,變長類型的真實長度在變長字段長度列表中的存儲是逆序存儲的如果實際存儲長度小於255則用一個字節表示,如果大於255則用兩個字節表示
2.NULL標志位:NULL標志位可以看作是NULL值列表,在表中的某些列中是可能存儲NULL值的,如果把這些NULL值放到記錄的真實數據中存儲是很占用空間的,所以Mysql中Compact行格式會把這些列值為NULL的列統一進行管理並存儲到NULL值列表中和變長字段長度列表一樣它也是逆序存儲的NULL值列表的存儲不占用真實存儲空間只占用NULL值列表,如果當前列為NULL值則用二進位1表示,當前列不為NULL值則用二進制位0表示,如果當前行中所有列都為NOT NULL則不會分配NULL列表的存儲空間,在實際開發中創建表時都會設置為NOT NULL因為這樣可以節省空間、提高整體的效率
注意:在行信息中有些信息是隱藏的,Mysq會為每行記錄都添加transaction_id和roll_pointer列,但row_id只會在表中沒有定義主鍵的時候才會記錄添加,相當於Mysql幫我們添加了一個主鍵
varchar變長類型的行溢出:因為varchar是變長類型,所以在存儲數據時超過一定長度(大致是8098字節)時會發生行一出,移除后的記錄內容為:768字節+剩余內容的地址信息(20字節),注意這里不是超過768就會行溢出而是溢出后只存儲768字節
行溢出臨界點判斷的計算公式:136+2*(27+n) > 16384 其中n為列中實際存儲的字節數