mysql數據是以行的形式存儲在數據頁中,行與行之間造成一個長的鏈表。
mysql
一行的數據除了insert into xxx values ();插入的數據外還存儲了其餘的數據信息,可是在執行client鏈接數據庫查詢數據時不會顯示。
sql
mysql行的格式有Compact,Redundant,Dynamic,Compressed四種,mysql5.5以上的默認compact格式,數據庫
查看系統的row_format格式bash
MariaDB [(none)]> show variables like 'innodb_%format'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | innodb_file_format | Antelope | +--------------------+----------+
行數據存儲compact格式網絡
幾個點了解一下:app
何謂變長?就是不定長。不定長從兩個點理解: 字符集與屬性類型ide
變長類型示例:varchar
、varbinary
、text
、blob
spa
這些變長列的實際佔用字節數以逆序
方式存儲在變長字段長度列表
中指針
逆序就是: 根據表中字段先後順序順序反過來把字段的內容存儲在該字段中日誌
容許的最大字節超過255且實際存儲超過127字節, 使用兩個字節存儲其長度, 不然使用一個字節.(看到有多節省了嗎...)
變長列不爲null
時, InnoDB
纔會存儲其字節長度
若是沒有變長列或變長列都爲null,則當前記錄沒有
此部分
第一個字節的第一位是標誌位,表示是否雙字節表示.(有點像gbk
哈)
一樣幾個點了解一下:
主鍵列、not null
修飾的列不在此範圍內
若是沒有能夠省略此部分。(即除了主鍵列全是not null
修飾)
一個列一個二進制位,1表示null
一樣逆序
存放
此部分由整數個字節組成, 不足地方高位補0
Compact行格式下記錄頭各部分示意圖(來源網絡)
名稱 | 大小(單位:bit) | 描述 |
---|---|---|
預留位1 | 1 | 沒有使用 |
預留位2 | 1 | 沒有使用 |
delete_mask |
1 | 標記該記錄是否被刪除 |
min_rec_mask |
1 | B+樹的每層非葉子節點中的最小記錄都會添加該標記 |
n_owned |
4 | 表示當前記錄擁有的記錄數 |
heap_no |
13 | 表示當前記錄在記錄堆的位置信息 |
record_type |
3 | 表示當前記錄的類型,0表示普通記錄 ,1表示B+樹非葉子節點記錄 ,2表示最小記錄 ,3表示最大記錄 |
next_record |
16 | 表示下一條記錄的相對位置 |
這裏一堆屬性,咱們挑幾個看看
delete_mask
被刪除的記錄值爲1, 正常記錄爲0
delete
語句後的記錄不會被馬上刪除,而是將這條記錄的delete_mask
置1, 稱爲delete mask
操做,與真正的直接刪除要區分開(update不更新主鍵且不能就地更新
時直接刪除,也就是改完delete_mask
後直接加入到垃圾鏈表中),這種操做是由於MySQL
還有一個東東叫MVCC
,後面會講。
這個屬性還涉及垃圾鏈表、重用空間什麼的
min_rec_mask
該記錄是否爲B+樹中非葉子節點的最小記錄
n_owned
在頁面內爲了快速搜索(二分查找)會分組
只有組內最大記錄此字段有值,記錄組內記錄數,除了最小記錄
,大小通常在4-8區間
heap_no
後面咱們會說到記錄在頁面內其實會組成一個單鏈表
,從頭至尾,此屬性依次增長.
最小記錄爲0,最大記錄爲1,真正記錄的這個值從2開始
record_type
頁內記錄類型,目前有四種類型
0就是咱們的通常意義上的記錄,1是索引用到的,後面再說
2是最小記錄、3 是最大記錄
next_record
本記錄的真正數據到下一條記錄的真正數據的偏移量(能夠當作存了個指針,向後是額外信息,向前是具體的列)
根據這個屬性,頁面內全部記錄都串了一個單鏈表
單鏈表按主鍵排序,從小到大,最小記錄與最大記錄分別爲頭結點和尾節點
列名 | 是否必須 | 佔用空間 | 描述 |
---|---|---|---|
row_id |
否 | 6字節 | 行ID,惟一標識一條記錄 |
transaction_id |
是 | 6字節 | 事務ID |
roll_pointer |
是 | 7字節 | 回滾指針 |
MySQL
爲咱們添加的隱藏列,不過也不是全部的狀況都添加:表中沒有指定主鍵且沒有Unique列, MySQL
會爲咱們添加一個row_id 做爲主鍵
其餘兩個每條記錄都會默認添加
trx_id
其實就是事務ID,這個是在五號表空間
的全局變量
roll_pointer
回滾指針,指向一條undo日誌記錄(在undo日誌記錄頁
中)
MySQL有個自增的功能,實際上是維護了一個全局變量
這個變量存儲在系統表空間的7號表(
7號表空間
)中,隨着記錄的插入而自增, 每逢256的倍數就刷到磁盤中重啓系統取出後加上256再賦予給自增列, 由於庫中可能已經超過了刷到磁盤中的這個值
最後一點, 強扭的瓜不只不甜也不解渴, 因此沒看懂就不要勉強......