持續(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)核