mysql innodb 表存儲結(jié)構(gòu)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容