mysql5.7行數據存儲格式


一、mysql的4種行數據存儲格式

mysql有4種存儲格式:1)Compact  2) Redundant (5.0版本以前用,已廢棄)  3) Dynamic (mysql5.7默認格式)   4) Compressed。   這是compact行格式數據存儲結構:


DB_ROW_ID(row_id)    如果表中沒有顯式定義主鍵列,mysql會默認生成一個row_id作為隱式主鍵,且row_id是全局概念,每一次有一行新數據insert,都會獲取Max Row ID再加1就形成了一個新的row_id
DB_TRX_ID       事務有關,跟回滾指針有關,6個字節
DB_ROLL_PTR   事務有關,跟回滾指針有關, 7個字節

delete mask : 標記為是否被delete語句commit,也就是mysql不會真正物理刪除一行記錄,在頁面上重新組裝一個新鏈表,稱為垃圾鏈表,如果垃圾鏈表占用空間可重用的話就會重用。

二、溢出頁

mysql規定每一頁(可存放16384字節)必須至少存放 2 條數據,每一行除了存儲真實數據之外,還會存儲行的額外信息(比如索引信息),大概132個字節,另外:變長字段長度列表、NULL值列表、記錄頭信息、 這一堆還要花27個字節,也就是 132 + 2 * ( 27 + n) < 16384,所以這樣會造成溢出頁。另外,mysql對於一個varchar列最多可以定義為65535個字節大小,但是當一個列比如是varchar(40000),會超出mysql對於一頁的磁盤存儲大小16KB * 1024 = 16384 > 40000 個字節,這個就需要分頁了,因為單頁數據溢出了,這里也會產生了溢出頁。

1)Compact和Redundant對於溢出的處理:mysql會存儲768個真實數據的字節,並且用20個字節存儲把其他數據存放到哪些頁中去。

2)Dynamic和Compressed對於溢出的處理:干脆連768個字節也不存了,直接存儲溢出頁地址。

三、索引頁格式

上面提到的132個字節,存的大概就是這些信息:

File Header : 文件頭。存儲雙向鏈表信息,undo日志也,溢出頁,索引頁等等,標志該頁是什么頁。用4個字節存儲當前頁號,一頁可以存儲2的32次方文件,大約20多億,一個innodb表空間可以存放20億左右的頁面 * 16KB = 64TB數據。mysql又用區去存儲頁,一區可以存儲64頁,大概是1M。於是mysql又用組來存儲區,一個區是256組。總結:一個表空間有多個組,每個組有256個區,一個區有64頁。

Page Header : 頁頭

Infimum + Supremum :兩條虛擬記錄,Infimum指向頁里單鏈表的最小記錄,經過所有真實數據行的指向串聯之后,最后指向Supremum頁里單鏈表的最大記錄。所以B+tree里每個葉子節點都有一前一后兩個虛擬記錄,分別會被上一頁指向和指向下一頁。列表的查找,平均查找記錄為n/2。為了提高效率,mysql把這一串列表分成幾組,把每組的最大值存到Page Directory頁目錄里面,稱之為 slot 槽。分槽是可以解決mysql順序查找的弊端,slot的分組規定,最后一個slot記錄數是1-8條之間,其他slot槽是4-8條之間。

User Records : 用戶真實數據

Free Space :空閑空間

Page Directory : 頁目錄

File Trailer : 文件尾部,校驗文件是否完整的信息。總共8個字節,前4個字節與File Header一模一樣,然后有一個字節是校驗盒,表示寫入了完整的16KB一頁數據,最后3個字節是“LSN”。

 

 

end.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM