MySQL InnoDB 存儲(chǔ)結(jié)構(gòu)

持續(xù)更新

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

InnoDB存儲(chǔ)引擎的邏輯存儲(chǔ)結(jié)構(gòu)和Oracle幾乎一樣,從大到小分別為:表空間、段、區(qū)、頁(yè),它們的關(guān)系如下圖所示:

表空間InnoDB有一個(gè)默認(rèn)的表空間,如果啟用了參數(shù)innodb_file_per_table,則針對(duì)每張可以單獨(dú)放在表空間里。這里需要注意的是,即時(shí)啟用了innodb_file_per_table,也并不是表中所有的數(shù)據(jù)都單獨(dú)放在自己的表空間里,單獨(dú)表空間只存放數(shù)據(jù)、索引和插入緩沖,其它如Undo、系統(tǒng)事務(wù)信息、二次寫緩沖等還是存放在默認(rèn)共享表空間里。

段表空間有若干各段組成,常見的有數(shù)據(jù)段、索引段、回滾段等。前面提到InnoDB中的表是索引組織表,因此數(shù)據(jù)段也稱為leaf node segment,索引段也稱為non-leaf node segment。

區(qū)每64個(gè)連續(xù)的頁(yè)組成區(qū),因此區(qū)大小正好為1M。

頁(yè)頁(yè)是InnoDB磁盤管理的最小單位,固定大小為16K,不可以更改(也許通過更改源碼可以修改固定大?。?/p>

行InnoDB表中數(shù)據(jù)按行存儲(chǔ)。

記錄結(jié)構(gòu)

三個(gè)部分

Name Size
Field Start Offsets (F1) or (F2) 字節(jié)
Extra Bytes 6 字節(jié)
Field Contents 和實(shí)際數(shù)據(jù)的長(zhǎng)度有關(guān)

F 表示字段的數(shù)量
字段指針(Origin 或 Zero Point)并非指向 Field Start Offsets,其實(shí)指向了第三部分 Field Contents 開始的位置。知道了字段指針,再做減法,就能得到前兩個(gè)部分的位置

1. Field Start Offsets

是一組偏移量(每個(gè)字段結(jié)尾到 Field Contents 開始的偏移量)的列表,記錄了字段的位置信息
此列表為反向排序,即第一個(gè)字段的偏移量放在列表末端
比如,有三個(gè)字段的長(zhǎng)度分別為 1、2、4,則 Field Start Offsets 為 07,03,01

每個(gè)偏移量用一個(gè)字節(jié)或兩個(gè)字節(jié)表示
當(dāng)記錄總長(zhǎng)度小于 127 字節(jié)時(shí),用一個(gè)字節(jié)表示
Extra Bytes 標(biāo)識(shí)使用了一個(gè)字節(jié)還是兩個(gè)字節(jié)

偏移量中的最高有效位通常表示 flag 標(biāo)記位

一個(gè)字節(jié)的偏移量:

Size 備注
1 bit 1 表示字段的值是 NULL
7 bits 實(shí)際的偏移量。范圍 0 - 127

兩個(gè)字節(jié)的偏移量:

Size 備注
1 bit 1 表示字段的值是 NULL
1 bit 0,字段存儲(chǔ)在同一頁(yè)
1,字段存儲(chǔ)在不同頁(yè)(BLOB 類型的字段才會(huì)在不同頁(yè))
14 bits 實(shí)際的偏移量。范圍 0 - 16383

2. Extra Bytes

固定長(zhǎng)度 6 字節(jié),即 48 位

Name Size Description
info_bits: () 1 bit 沒用
() 1 bit 沒用
deleted_flag 1 bit 1 表示記錄已刪除
min_rec_flag 1 bit 1 表示此記錄是預(yù)定義的最小值記錄
n_owned 4 bits 此記錄擁有的記錄數(shù)(???)
heap_no 13 bits 記錄在索引頁(yè)堆中的序號(hào)(???)
n_fields 10 bits 字段數(shù)量, 1 to 1023
1byte_offs_flag 1 bit 表示 Field Start Offsets 是一個(gè)字節(jié)還是兩個(gè)字節(jié)
1 表示是一個(gè)字節(jié)
next 16 bits 16 bits 指向下一記錄的指針
TOTAL 48 bits -

3. Field Contents

存儲(chǔ)實(shí)際數(shù)據(jù),按照表定義的順序存儲(chǔ)

頁(yè)結(jié)構(gòu)

七個(gè)部分

Fil Header
Page Header
Infimum + Supremum Records
User Records
Free Space
Page Directory
Fil Trailer

參考資料

http://dev.mysql.com/doc/internals/en/innodb.html
楊萬(wàn)富、思考mysql內(nèi)核

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

相關(guān)閱讀更多精彩內(nèi)容

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