最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL之InnoDB存儲(chǔ)頁的獨(dú)立表空間解讀

 更新時(shí)間:2025年06月26日 15:34:47   作者:在成都搬磚的鴨鴨  
這篇文章主要介紹了MySQL之InnoDB存儲(chǔ)頁的獨(dú)立表空間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、背景

我們往一張表里插入的行數(shù)據(jù)是存儲(chǔ)在頁上的,一張頁的大小為16KB,數(shù)據(jù)量大的時(shí)候一張頁不可能存儲(chǔ)完一張表里的所有數(shù)據(jù),所以需要多張頁來進(jìn)行存儲(chǔ),這多張頁所在的存儲(chǔ)空間就叫表空間,表空間分為系統(tǒng)表空間獨(dú)立表空間,接下來就講一下獨(dú)立表空間上是如何存儲(chǔ)頁的。

2、獨(dú)立表空間

【1】表空間大小

之前講過頁的組成,我們?cè)賮砜匆幌马摰耐ㄓ貌糠諪ile Header(38字節(jié)大小)的組成:

名稱字節(jié)大小含義
FIL_PAGE_SPACE_OR_CHKSUM4頁的校驗(yàn)和
FIL_PAGE_OFFSET4頁號(hào)
FIL_PAGE_PREV4上一頁
FIL_PAGE_NEXT4下一頁
FIL_PAGE_LSN8頁最后被修改時(shí)對(duì)應(yīng)的日志序列位置
FIL_PAGE_TYPE2頁類型
FIL_PAGE_FILE_FLUSH_LSN8僅在系統(tǒng)表空間的一個(gè)頁中定義,代表文件執(zhí)行被刷新到了對(duì)應(yīng)的LSN值
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4頁屬于哪個(gè)表空間

File Header里的頁號(hào)由4字節(jié)組成,也就是32位,所以一個(gè)表空間最多能存儲(chǔ)232個(gè)頁,每個(gè)頁按照16KB的大小來算,一個(gè)表空間最多可以存儲(chǔ)64TB的大小的數(shù)據(jù)

【2】區(qū)

表空間里每連續(xù)64個(gè)頁組成一個(gè)區(qū),一個(gè)頁按16KB大小來算,一個(gè)區(qū)的大小就為64*16KB=1MB,如下圖表示:

在這里插入圖片描述

【3】組

表空間上連續(xù)256個(gè)區(qū)就為一個(gè)組,區(qū)0到區(qū)255就為第一個(gè)組,區(qū)256到區(qū)511就為第二個(gè)組,剩下的以此內(nèi)推,需要注意的是,第一個(gè)組的前三個(gè)頁的類型是固定,其它組的前兩個(gè)頁類型是固定的,在講這些頁之前我們先看一下頁的類型有幾種:

類型含義
FIL_PAGE_UNDO_LOGUndo日志頁
FIL_PAGE_INODE段信息節(jié)點(diǎn)
FIL_PAGE_IBUF_FREE_LISTInsert Buffer空閑列表
FIL_PAGE_IBUF_BITMAPInsert Buffer位圖
FIL_PAGE_TYPE_SYS系統(tǒng)頁
FIL_PAGE_TYPE_TRX_SYS事務(wù)系統(tǒng)數(shù)據(jù)
FIL_PAGE_TYPE_FSP_HDR表空間頭部信息
FIL_PAGE_TYPE_XDES擴(kuò)展描述頁
FIL_PAGE_TYPE_BLOBBLOB頁

再看組的表結(jié)構(gòu)圖,如下圖:

在這里插入圖片描述

【4】段

一個(gè)索引有葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn),存放葉子節(jié)點(diǎn)所在區(qū)的集合就叫葉子段,存放非葉子節(jié)點(diǎn)所在區(qū)的集合就叫非葉子段,一個(gè)索引有兩個(gè)段。

【5】區(qū)的類型

段就是索引中葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn)所在區(qū)的集合,一個(gè)索引兩個(gè)段,一個(gè)區(qū)64個(gè)頁,數(shù)據(jù)量小的時(shí)候用一個(gè)區(qū)來作為存儲(chǔ)單位十分浪費(fèi)空間,所以就有了碎片區(qū)的概念,在數(shù)據(jù)量小的時(shí)候段就以碎片區(qū)中的頁為單位來分配空間,數(shù)據(jù)量大的時(shí)候就以區(qū)為單位來分配存儲(chǔ)空間,碎片區(qū)不屬于任何段,并且碎片區(qū)里的頁可以存儲(chǔ)多個(gè)索引的數(shù)據(jù),區(qū)的類型有如下幾種:

區(qū)類型含義
FREE屬于表空間,區(qū)中的頁都沒被使用
FREE_FRAG屬于表空間,有可用頁的碎片區(qū)
FULL_FRAG無可用頁的碎片區(qū)
FSEG屬于某個(gè)段的區(qū)

【6】XDES Entry區(qū)結(jié)構(gòu)

InnoDB中每一個(gè)區(qū)都對(duì)應(yīng)一個(gè)XDES Entry結(jié)構(gòu),其組成圖如下:

在這里插入圖片描述

XDES Entry結(jié)構(gòu)字段含義如下:

XDES Entry字節(jié)大小含義
Segment ID8段的唯一編號(hào),只有FSEG類型的區(qū)此字段才有用
List Node12指向上一個(gè)和下一個(gè)XDES Entry結(jié)構(gòu)
State4FREE、FREE_FRAG、FULL_FRAG、FSEG四種區(qū)類型
Page State Bitmap1616字節(jié)對(duì)應(yīng)的128比特位,其中每2個(gè)比特位對(duì)應(yīng)一個(gè)區(qū)64個(gè)頁中的一個(gè)頁,2個(gè)比特位中第一個(gè)比特位代表該頁是否被使用

List Node結(jié)構(gòu)字段含義如下:

List Node字節(jié)大小含義
Prev Node Page Number4上一個(gè)XDES Entry結(jié)構(gòu)所在的頁
Prev Node Offset2上一個(gè)XDES Entry結(jié)構(gòu)頁內(nèi)偏移量
Next Node Page Number4下一個(gè)XDES Entry結(jié)構(gòu)所在的頁
Next Node Offset2下一個(gè)XDES Entry結(jié)構(gòu)頁內(nèi)偏移量

【7】XDES Entry鏈表

在數(shù)據(jù)量比較小的時(shí)候,段是以碎片區(qū)中的頁為單位來分配存儲(chǔ)空間的,插入數(shù)據(jù)方式如下:

  • 1、查找表空間中狀態(tài)為FREE_FRAG的區(qū),找到了就取出零碎的頁把數(shù)據(jù)插進(jìn)去,
  • 2、沒找到就申請(qǐng)一個(gè)狀態(tài)為FREE的區(qū),將狀態(tài)變?yōu)镕REE_FRAG,再取出零碎的頁將數(shù)據(jù)插入進(jìn)去,
  • 3、之后再插入數(shù)據(jù)當(dāng)沒有零碎的頁可用時(shí)狀態(tài)就變?yōu)镕ULL_FRAG。

快速查找這3個(gè)類型的區(qū)通過3個(gè)鏈表來查找,這3個(gè)鏈表是屬于表空間獨(dú)有的,3個(gè)鏈表如下:

鏈表含義
FREE鏈表FREE狀態(tài)的區(qū)對(duì)應(yīng)的XDES Entry結(jié)構(gòu)通過List Node組成的鏈表
FREE_FRAG鏈表FREE_FRAG狀態(tài)的區(qū)對(duì)應(yīng)的XDES Entry結(jié)構(gòu)通過List Node組成的鏈表
FULL_FRAG鏈表FULL_FRAG狀態(tài)的區(qū)對(duì)應(yīng)的XDES Entry結(jié)構(gòu)通過List Node組成的鏈表

當(dāng)一個(gè)段中的數(shù)據(jù)超過32個(gè)零碎的頁之后,就以區(qū)為單位來分配存儲(chǔ)空間了,此時(shí)每個(gè)段都涉及3個(gè)鏈表,注意每個(gè)段都有3個(gè)鏈表,3個(gè)鏈表如下:

鏈表含義
FREE鏈表同一個(gè)段中所有頁都是空閑的區(qū)對(duì)應(yīng)的XDES Entry結(jié)構(gòu)組成一個(gè)鏈表
NOT_FULL鏈表同一個(gè)段中有空閑頁的區(qū)對(duì)應(yīng)的XDES Entry結(jié)構(gòu)組成一個(gè)鏈表
FULL鏈表同一個(gè)段中沒有有空閑頁的區(qū)對(duì)應(yīng)的XDES Entry結(jié)構(gòu)組成一個(gè)鏈表

【8】XDES Entry鏈表基節(jié)點(diǎn)

為了快速找到XDES Entry鏈表的頭和尾,InnoDB中設(shè)計(jì)了鏈表基節(jié)點(diǎn)結(jié)構(gòu)List Base Node,其結(jié)構(gòu)圖如下:

在這里插入圖片描述

【9】INODE Entry段結(jié)構(gòu)

段也有一個(gè)對(duì)應(yīng)的結(jié)構(gòu)INODE Entry,其結(jié)構(gòu)如圖:

在這里插入圖片描述

INODE Entry結(jié)構(gòu)字段含義如下:

INODE Entry字節(jié)大小含義
Segment Id8段的唯一id
NOT_FULL_N_USED4NOT_FULL鏈表中已經(jīng)使用了的頁數(shù)
List Base Node For FREE List16對(duì)應(yīng)段中的FREE鏈表
List Base Node For NOT_FULL List16對(duì)應(yīng)段中的NOT_FULL鏈表
List Base Node For FULLList16對(duì)應(yīng)段中的FULL鏈表
Magic Number4INODE Entry是否被初始化
Fragment Array Entry4零碎頁頁號(hào),總共32個(gè)

【10】FIL_PAGE_TYPE_FSP_HDR頁類型

表空間第一個(gè)組中第一個(gè)頁的類型為FIL_PAGE_TYPE_FSP_HDR,結(jié)構(gòu)如下:

在這里插入圖片描述

FIL_PAGE_TYPE_FSP_HDR字段解釋:

字段字節(jié)大小含義
File Header38頁的通用信息
FIle Space Header112表空間的一些整體屬性
XDES Entry10240256個(gè)區(qū)信息
Empty Space5986未使用的空間
File Trailer8校驗(yàn)頁是否完整

File Space Header結(jié)構(gòu)字段解釋:

字段字節(jié)大小含義
Space ID4表空間ID
Not Used4未使用
Size4表空間占有的頁數(shù)
FREE Limit4未被初始化的最小頁號(hào),大于等于此頁號(hào)對(duì)應(yīng)的區(qū)的XDES Entry結(jié)構(gòu)都沒被加入FREE鏈表
Space Flags4存儲(chǔ)占用空間比較小的屬性
FRAG_N_USED4FREE_FRAG鏈表中已使用的頁數(shù)量
List Base Node for FREE List16FREE鏈表基節(jié)點(diǎn)
List Base Node for FREE_FRAG List16FREE_FRAG鏈表的基節(jié)點(diǎn)
List Base Node for FULL_FRAG List16FULL_FREG鏈表的基節(jié)點(diǎn)
Next Unused Segment ID8表空間中下一個(gè)未使用的段ID
List Base Node for SEG_INODES_FULL List16SEG_INODES_FULL鏈表的基節(jié)點(diǎn)
List Base Node for SEG_INODES_FREE List16SEG_INODES_FREE鏈表的基節(jié)點(diǎn)

【11】FIL_PAGE_IBUF_BITMAP頁類型

表空間所有組的第二個(gè)頁的類型為FIL_PAGE_IBUF_BITMAP,用于InnoDB存儲(chǔ)引擎中事務(wù)日志緩沖區(qū),與插入緩沖有關(guān),后面再講。

【12】FIL_PAGE_INODE頁類型

第一組第三個(gè)頁類型就為FIL_PAGE_INODE,用于存儲(chǔ)段結(jié)構(gòu)INODE Entry,其頁結(jié)果如圖:

在這里插入圖片描述

FIL_PAGE_INODE頁類型字段解釋如下:

字段名字節(jié)大小含義
File Header38頁的通用信息
List Node for INODE Page List12存儲(chǔ)上一個(gè)INODE頁和下一個(gè)INODE頁
INODE Entry16128段信息,可以存儲(chǔ)85個(gè)
Empty Space6未使用的空間
File Trailer8校驗(yàn)頁是否完整

可以看到一個(gè)FIL_PAGE_INODE類型的頁最多存儲(chǔ)85個(gè)INODE Entry段結(jié)構(gòu),如果超過85個(gè),就需要申請(qǐng)其它FIL_PAGE_INODE類型的頁來進(jìn)行存儲(chǔ)了,所有FIL_PAGE_INODE類型的頁會(huì)組成兩個(gè)鏈表,這兩個(gè)鏈表存儲(chǔ)在FIL_PAGE_TYPE_FSP_HDR類型頁的File Space Header結(jié)構(gòu)里,鏈表如下:

鏈表含義
SEG_INODES_FULL鏈表FIL_PAGE_INODE類型的頁中沒有空閑空間來存儲(chǔ)INODE Entry段結(jié)構(gòu)
SEG_INODES_FREE鏈表FIL_PAGE_INODE類型的頁中有空閑空間來存儲(chǔ)INODE Entry段結(jié)構(gòu)

存儲(chǔ)一個(gè)INODE Entry結(jié)構(gòu)的過程如下:

  • 1、從SEG_INODES_FULL鏈表中取出一個(gè)頁去存儲(chǔ)INODE Entry段結(jié)構(gòu),
  • 2、如果頁上的INODE Entry段機(jī)構(gòu)存儲(chǔ)滿了就放入SEG_INODES_FREE鏈表,
  • 3、如果SEG_INODES_FULL鏈表為空,就從表空間所屬的FREE_FRAG鏈表中取出一個(gè)零碎頁,修改其類型為FIL_PAGE_INODE,再放入SEG_INODES_FULL鏈表中。

【13】FIL_PAGE_TYPE_XDES頁類型

表空間第一個(gè)組之外的其它組的第一個(gè)頁類型為FIL_PAGE_TYPE_XDES,和FIL_PAGE_TYPE_FSP_HDR頁類型差不多,相比少了一些其它屬性,其結(jié)構(gòu)圖如下:

在這里插入圖片描述

【14】索引關(guān)聯(lián)INODE Entry段結(jié)構(gòu)

一個(gè)索引有兩個(gè)段,它們之間是這樣關(guān)聯(lián)起來的,數(shù)據(jù)頁組成的頁類型中有兩個(gè)字段如下:

字段字節(jié)大小含義
PAGE_BTR_SEG_LEAF10B+樹葉子段的頭部信息,只在B+樹的根頁定義
PAGE_BTR_SEG_TOP10B+樹非葉子段的頭部信息,只在B+樹的根頁定義

這兩個(gè)字段各對(duì)應(yīng)一個(gè)Segment Header結(jié)構(gòu)如下:

Segment Header字段字節(jié)大小含義
SpaceID ofthe INODE Entry4INODE Entry結(jié)構(gòu)所在的表空間ID
Page Number of the INODE Entry4INODE Entry結(jié)構(gòu)所在頁號(hào)
Byte Offset of the INODE Ent2INODE Entry結(jié)構(gòu)在頁中偏移量

通過Segment Header就能很方便找到索引對(duì)應(yīng)的INODE Entry段結(jié)構(gòu),并且只需要在B+樹的根節(jié)點(diǎn)中定義這兩字段。

3、總結(jié)

本文主要講解獨(dú)立表空間的組成部分,涉及到頁、區(qū)、組還有各種結(jié)構(gòu)等,后續(xù)可以再講解系統(tǒng)表空間的組成,和獨(dú)立表空間類似。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql中@和@@符號(hào)的詳細(xì)使用指南

    Mysql中@和@@符號(hào)的詳細(xì)使用指南

    最近工作遇到了一個(gè)問題,給自己做個(gè)記錄,下面這篇文章主要給大家介紹了關(guān)于Mysql中@和@@符號(hào)的詳細(xì)使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • mysql datetime查詢異常問題解決

    mysql datetime查詢異常問題解決

    這篇文章主要介紹了mysql datetime查詢異常問題解決的相關(guān)資料,這里對(duì)異常進(jìn)行了詳細(xì)的介紹和該如何解決,需要的朋友可以參考下
    2016-11-11
  • mysql?sock文件存儲(chǔ)了什么信息

    mysql?sock文件存儲(chǔ)了什么信息

    這篇文章主要為大家介紹了mysql?sock文件存儲(chǔ)了什么信息的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • MySQL異常宕機(jī)無法啟動(dòng)的處理過程

    MySQL異常宕機(jī)無法啟動(dòng)的處理過程

    MySQL宕機(jī)是指MySQL數(shù)據(jù)庫服務(wù)突然停止運(yùn)行,通??赡苁怯捎谟布收稀④浖e(cuò)誤、資源耗盡、網(wǎng)絡(luò)中斷、配置問題或是惡意攻擊等導(dǎo)致,當(dāng)MySQL發(fā)生宕機(jī)時(shí),系統(tǒng)可能無法提供數(shù)據(jù)訪問,本文給大家介紹了MySQL異常宕機(jī)無法啟動(dòng)的處理過程,需要的朋友可以參考下
    2024-08-08
  • Navicat修改MySQL數(shù)據(jù)庫密碼的多種方法

    Navicat修改MySQL數(shù)據(jù)庫密碼的多種方法

    這篇文章主要介紹了Navicat修改MySQL數(shù)據(jù)庫密碼,需要的朋友可以參考下
    2018-09-09
  • SQL-?join多表關(guān)聯(lián)問題

    SQL-?join多表關(guān)聯(lián)問題

    這篇文章主要介紹了SQL-?join多表關(guān)聯(lián)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • 深入談?wù)凪ySQL中的自增主鍵

    深入談?wù)凪ySQL中的自增主鍵

    這篇文章主要給大家介紹了關(guān)于MySQL中自增主鍵的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 解決MySQL報(bào)錯(cuò):You?can‘t?specify?target?table?‘region‘?for?update?in?FROM?clause

    解決MySQL報(bào)錯(cuò):You?can‘t?specify?target?table?‘region‘?for?

    這篇文章主要給大家介紹了關(guān)于MySQL報(bào)錯(cuò):You?can‘t?specify?target?table?‘region‘?for?update?in?FROM?clause的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • MySQL 中 blob 和 text 數(shù)據(jù)類型詳解

    MySQL 中 blob 和 text 數(shù)據(jù)類型詳解

    本文主要介紹了MySQL中blob和text數(shù)據(jù)類型詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • MySQL高級(jí)開發(fā)中視圖的詳細(xì)教程

    MySQL高級(jí)開發(fā)中視圖的詳細(xì)教程

    對(duì)MySQL數(shù)據(jù)庫的查詢,除了基本的查詢外,有時(shí)候需要對(duì)查詢的結(jié)果集進(jìn)行處理,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作中視圖的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

深州市| 中宁县| 雅江县| 海宁市| 常宁市| 法库县| 皋兰县| 双流县| 秭归县| 潞西市| 神木县| 七台河市| 满城县| 罗江县| 丰原市| 临朐县| 沁水县| 平邑县| 台江县| 宁国市| 永靖县| 哈密市| 江川县| 凉城县| 平遥县| 土默特右旗| 广饶县| 常德市| 江永县| 苏尼特右旗| 仙游县| 布尔津县| 全南县| 锡林浩特市| 泗水县| 榆树市| 嘉峪关市| 射洪县| 广水市| 永福县| 灵宝市|