mysql的行格式

    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 |
+--------------------+----------+

建立表的時候能夠指定 row_format=compact

行數據存儲compact格式網絡

compact.jpg

1、變長字段長度列表

幾個點了解一下:app

  1. 何謂變長?就是不定長。不定長從兩個點理解: 字符集與屬性類型ide

  2. 變長類型示例:varcharvarbinarytextblobspa

  3. 這些變長列的實際佔用字節數以逆序方式存儲在變長字段長度列表指針

    逆序就是: 根據表中字段先後順序順序反過來把字段的內容存儲在該字段中日誌

  4. 容許的最大字節超過255且實際存儲超過127字節, 使用兩個字節存儲其長度, 不然使用一個字節.(看到有多節省了嗎...)

  5. 變長列不爲null時, InnoDB纔會存儲其字節長度

  6. 若是沒有變長列或變長列都爲null,則當前記錄沒有此部分

  7. 第一個字節的第一位是標誌位,表示是否雙字節表示.(有點像gbk哈)


2、NULL值列表

一樣幾個點了解一下:

  • 主鍵列、not null 修飾的列不在此範圍內

  • 若是沒有能夠省略此部分。(即除了主鍵列全是not null修飾)

  • 一個列一個二進制位,1表示null

  • 一樣逆序存放

  • 此部分由整數個字節組成, 不足地方高位補0


3、記錄頭信息

記錄頭信息.jpg


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
  • 本記錄的真正數據到下一條記錄的真正數據的偏移量(能夠當作存了個指針,向後是額外信息,向前是具體的列)

  • 根據這個屬性,頁面內全部記錄都串了一個單鏈表

  • 單鏈表按主鍵排序,從小到大,最小記錄與最大記錄分別爲頭結點和尾節點


4、正式數據部分

列名 是否必須 佔用空間 描述
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再賦予給自增列, 由於庫中可能已經超過了刷到磁盤中的這個值

  • 最後一點, 強扭的瓜不只不甜也不解渴, 因此沒看懂就不要勉強......

相關文章
相關標籤/搜索