以Innodb引擎爲例。
mysql數據邏輯上是一行一行存放的,物理上,則是以頁單位存放的,頁也是mysql操作的基本單位。一頁大小一般是16kb。
下面看下頁內具體一行數據的模型,也就是Innodb的行模式。共有四種:Compact
、Redundant
、Dynamic
和Compressed。
以Compact爲例:
(本篇圖片全部來自掘金小冊中《MySQL是怎樣運行的》一書)
大致可以分爲兩塊:數據區和必要信息;
必要信息:主要包括變長字段長度列表和null值列表,以及一些頭信息。
變長字段長度列表:一些列是變長的,因爲字符集可能是變長的,或者列的數據類型比如blob或者varchar這種,對於這樣的數據列的值,innodb存儲時肯定需要具體的數據長度,這個長度就是存在變長字段長度列表裏的;
null值列表:可空列如果沒有數據,innodb不會在記錄裏存一個null,而是將其記錄在null值列表中,這個列表本質上是通過字節的bit位來代表空列的,每一個bit位對應一個可空的列,用0和1表示是否爲空。
頭信息:
(本篇圖片全部來自掘金小冊中《MySQL是怎樣運行的》一書)
剩下就是真實記錄部分了。真實記錄處理存儲各個列的值外,innodb還會分配隱藏列:rowid,trxid以及rollbackPointer。
rowid:可選,如果沒有指定主鍵時,innodb會隱式分配一個自增主鍵;
trxid:最後修改該行數據的trxid;
rollbackPointer:回滾段指針;