从根儿上理解mysql_从根儿上理解 MySQL - 页总结
頁結構簡介
由于 MySQL 的真實數據是存儲在磁盤, 因此在讀寫數據是會涉及磁盤 IO, 為了更高效率的讀取, MySQL 設計頁結構, 每次交互以頁為單位讀取到內存. 頁的大小一般為 16KB
行格式
行格式主要分為四種類型Compact、Redundant、Dynamic和Compressed. 主要理解 Compact
Compact 行格式
行格式主要分為記錄的額外信息, 記錄的真實數據
變長字段長度列表
變長字段長度列表存儲的是變長類型的真實數據的占用字節數(逆序).
如果該表沒有變長類型, 則無變長字段長度列表
變長字段長度列表只保存 NOT NULL列, 如果該列允許為 NULL, 則不會保存
舉例: 字段 0 int 0, 字段1 vachar(10) NOT NULL 'A', 字段2 vachar(10) default NULL 'B', 字段3 vachar(10) NOT NULL 'AA'
變長字段長度列表: 02 01
可通過 變長字段反推字段的長度
復制代碼
NULL 值列表
NULL 值列表只統計哪些字段允許為 NULL的值狀態(逆序)
如果該表沒有允許 NULL 列, 則無 NULL 值列表
MySQL規定NULL值列表必須用整數個字節的位表示,如果使用的二進制位個數不是整數個字節,則在字節的高位補0
二進制位的值為1時,代表該列的值為NULL 二進制位的值為0時,代表該列的值不為NULL
舉例: 字段 0 vachar(10) NOT NULL 'A', 字段1 vachar(10) default NULL 'B', 字段2 vachar(10) default NULL NULL, 字段3 vachar(10) default NULL NULL
逆序后: 字段3 - 1, 字段2 - 1, 字段1 - 0
NULL 值列表: 00000110
可通過 NOT NULL 字段反推哪些字段值為 NULL, 哪些字段值不為 NULL
復制代碼
記錄頭
這一部分牽扯的內容較多
大致可以看一下刪除標識(刪除是并非真正刪除, 只是修改表示), 下一條記錄位置(B+樹特性)
除了這些詳細信息, 還會有 MySQL 自動添加的隱藏列
實際上這幾個列的真正名稱其實是:DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR, 為了美觀才寫成了row_id、transaction_id和roll_pointer
row_id: 有主鍵使用主鍵, 沒有主鍵有唯一鍵使用唯一鍵, 沒有則自動生成
transaction_id: 事務 ID
roll_pointer: 回滾指針
行溢出
因為一個頁占用 16KB, 16 * 1024 = 16384 字節, 而 varchar 最多可以占用65535, 不包括隱藏列和記錄頭信息
但是在我們使用 varchar 時, 會設置變長字段長度列表和 NULL 值列表
對于 NOT NULL, 只能使用65533字節 (兩個字節用來表示長度) 對于非 NOT NULL, 只用使用 65532 字節 (兩個字節用來表示長度, 一個字節用來表示 NULL 標識)
對于行溢出的情況, 真實的數據只用存儲前 768 字節, 后面放的是溢出頁地址
復制代碼
行溢出的節點
綜上所述, 我們知道在數據的占用字節數超過某個閾值就會發生行溢出, 那么行溢出的計算方式分析如下
ps: 截圖來源于MySQL 是怎樣運行的:從根兒上理解 MySQL(小孩子 4919)
其他
delete_mask
這個屬性標識該條記錄是否已刪除
如果 MySQL 設計刪除一條則執行磁盤刪除, 會導致磁盤IO增加, MySQL 為了優化, 使用一個標識表示該記錄已被刪除, 如果有新的記錄來, 會覆蓋該條記錄
如果想要優化空間, 則執行 optimize table 'name' 即可
參考文獻
總結
以上是生活随笔為你收集整理的从根儿上理解mysql_从根儿上理解 MySQL - 页总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql user表修复_Mysql
- 下一篇: linux cmake编译源码,linu