1 邏輯存儲結(jié)構(gòu)

表空間-段-區(qū)-頁
1.1 表空間
- 共享表空間ibdata1 存放undo信息、系統(tǒng)事物信息、二次寫緩沖
- innodb_file_per_table ON打開后每一個table都有一個表空間,存放數(shù)據(jù)、索引、插入緩沖
1.2 段
數(shù)據(jù)段、索引段、回滾段
1.3 區(qū)
- 每個區(qū)1M,由64個連續(xù)的頁組成,每個頁16K
- 引擎最多每次可以申請4個區(qū),保證數(shù)據(jù)的順序性能
1.4 頁

頁結(jié)構(gòu)
- B+樹索引本身并不能找到具體的一條記錄,只能找到該記錄所在的頁,之后引擎把頁加載到內(nèi)存,通過PageDirectory再進(jìn)行二叉查找
1.5 行
官網(wǎng) https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html#innodb-row-format-defining
行記錄格式 innodb_default_row_format 默認(rèn) DYNAMIC
- REDUNDANT
- COMPACT
768前綴字節(jié)+20字節(jié)指針 -> off page - DYNAMIC
20字節(jié)指針 -> off page -
COMPRESSED
對off page內(nèi)容進(jìn)行zlib算法壓縮(BLOB TEXT VARCHAR)
COMPACT
| 變長字段長度列表 | NULL | 記錄頭信息 | 隱藏列 | 字段1 | 字段2 | 字段n |
|---|
- 變長字段長度列表
按列的順序逆序排列,最多兩個字節(jié)(所以varchar長度< 2^16-1=65535)
<todo>待驗(yàn)證?
一個字節(jié)可以最多表示255,但是 MySQL 設(shè)計(jì)長度表示時,為了區(qū)分是否是一個字節(jié)表示長度,規(guī)定,如果最高位為1,那么就是兩個字節(jié)表示長度,否則就是一個字節(jié)。例如,01111111,這個就代表長度為 127,而如果長度是 128,就需要兩個字節(jié),就是 10000000 10000000,首個字節(jié)的最高位為1,那么這就是兩個字節(jié)表示長度的開頭,第二個字節(jié)可以用所有位表示長度,并且需要注意的是,MySQL采取 Little Endian 的計(jì)數(shù)方式,低位在前,高位在后,所以 129 就是 10000001 10000000。同時,這種標(biāo)識方式,最大長度就是 2^15 - 1 = 32767,也就是32 KB
- NULL標(biāo)志位
逆序排列,二進(jìn)制位標(biāo)志(1是null,0不是null) - 記錄頭信息record header 5B
next-recorder 下一行相對位置(所以在頁中行就像一個鏈表) - 隱藏列
rowid 6B
事物id 6B
回滾指針 7B
參考資料
https://blog.csdn.net/KouLouYiMaSi/article/details/101475473
https://blog.csdn.net/zhxdick/article/details/107049949
https://blog.csdn.net/qq_35590091/article/details/107361172