深入理解InnoDB(6)—獨立表空間

InnoDB的表空間

image.png
表空間可以看做是InnoDB存儲引擎邏輯結構的最高層 ,所有的數據都是存放在表空間中。

1. Extent

對于16KB的頁來說,連續的64個頁就是一個區,也就是說一個區默認占用1MB空間大小。

每256個區被劃分成一組,第一組的前3個頁面是固定的(FSP_HDR,IBUF_BITMAP,INODE),每組的前兩個頁面是固定的(XDES,IBUF_BITMAP)

1.1 為什么需要引入區的概念?

因為B+樹的每一層的節點,都是用一個雙向鏈表連起來的,如果以頁作為存儲單位的話,在B+樹上相鄰的兩個節點,可能在磁盤上相隔非常遠,就會造成磁盤的隨機I/O,因此我們應該使得相鄰位置的節點,物理位置也盡量相連,形成順序I/O。

所以,所以才引入了區(extent)的概念,一個區就是在物理位置上連續的64個頁。在表中數據量大的時候,為某個索引分配空間的時候就不再按照頁為單位分配了,而是按照區為單位分配

1.2 區的分類

  • FREE 空閑的區
  • FREE_FRAG 有剩余空間的碎片區
  • FULL_FRAG 沒有剩余空間的碎片區
  • FSEG 附屬于某個段的區
    注意:處于FREE、FREE_FRAG以及FULL_FRAG這三種狀態的區都是獨立的,算是直屬于表空間;而處于FSEG狀態的區是附屬于某個段的。

1.3 XDES Entry

每一個區都對應著一個XDES Entry結構.XDES Entry的組成如下圖

image.png

  • Segment ID(8字節)
    該區所屬的段的ID
  • List Node(12字節)
    將XDES Entry連成一個鏈表,存儲的是指向上一個XDES和下一個XDES的指針
  • State(4字節)
    前面說到的幾種區的分類,FREE、FREE_FRAG、FULL_FRAG和FSEG
  • Page State Bitmap(16字節)
    這個部分共占用16個字節,也就是128個比特位。我們說一個區默認有64個頁,這128個比特位被劃分為64個部分,每個部分2個比特位,對應區中的一個頁。這兩個比特位的第一個位表示對應的頁是否是空閑的,第二個比特位還沒有用。

1.3.1 XDES Entry鏈表

當向某個段中插入數據時

  1. 在剛開始向表中插入數據的時候,段是從某個碎片區以單個頁面為單位來分配存儲空間的。
    因此,查找FREE_FRAG 有剩余空間的碎片區,申請一些零散的頁面將數據插入,直到為FULL_FRAG。否則找FREE空閑的區,插入數據。而為了查找特定狀態的區:
  • 把狀態為FREE的區對應的XDES Entry結構通過List Node來連接成一個鏈表,這個鏈表我們就稱之為FREE鏈表。

  • 把狀態為FREE_FRAG的區對應的XDES Entry結構通過List Node來連接成一個鏈表,這個鏈表我們就稱之為FREE_FRAG鏈表。

  • 把狀態為FULL_FRAG的區對應的XDES Entry結構通過List Node來連接成一個鏈表,這個鏈表我們就稱之為FULL_FRAG鏈表。

  1. 當某個段已經占用了32個碎片區頁面之后,就會以完整的區為單位來分配存儲空間

因為一個段中可以有好多個區,有的區是完全空閑的,有的區還有一些頁面可以用,有的區已經沒有空閑頁面可以用了,為了找出段中特定狀態的區:

  • FREE鏈表:同一個段中,所有頁面都是空閑的區對應的XDES Entry結構會被加入到這個鏈表。注意和直屬于表空間的FREE鏈表區別開了,此處的FREE鏈表是附屬于某個段的。

  • NOT_FULL鏈表:同一個段中,仍有空閑空間的區對應的XDES Entry結構會被加入到這個鏈表。

  • FULL鏈表:同一個段中,已經沒有空閑空間的區對應的XDES Entry結構會被加入到這個鏈表。

1.3.2 鏈表基節點

上面說到的6種鏈表,都對應著一個LIst Base Node,因此只要記錄下鏈表基節點,就可以搜索整個鏈表

image.png

  • List Length表明該鏈表一共有多少節點,

  • First Node Page Number和First Node Offset表明該鏈表的頭節點在表空間中的位置。

  • Last Node Page Number和Last Node Offset表明該鏈表的尾節點在表空間中的位置。

2.segment

段由若干個零散的頁面以及一些完整的區組成。

2.1 為什么需要引入段的概念?

在進行范圍查詢的時候,其實我們是對B+樹的葉子節點進行掃描,如果將B+樹的葉子節點和非葉子節點都放在一個地方的話,就會影響范圍查詢的速度。

因此,InnoDB將葉子節點的區的集合分為一個段,非葉子區的集合同樣也分為一個段。也就是說一個索引會生成2個段,一個葉子節點段,一個非葉子節點段。

但是這也帶來了一個問題,就是無論如何一個索引都要至少要占用兩個區,就是2M的空間,即使數據量遠小于2M,就會造成浪費,因此引入了碎片區的概念。

2.3 碎片區

在一個碎片區中,并不是所有的頁都是為了存儲同一個段的數據而存在的,而是碎片區中的頁可以用于不同的目的,比如有些頁用于段A,有些頁用于段B,有些頁甚至哪個段都不屬于。碎片區直屬于表空間,并不屬于任何一個段。所以此后為某個段分配存儲空間的策略是這樣的:

  1. 在剛開始向表中插入數據的時候,段是從某個碎片區以單個頁面為單位來分配存儲空間的。

  2. 當某個段已經占用了32個碎片區頁面之后,就會以完整的區為單位來分配存儲空間。

2.4 INODE Entry

與區的XDES Entry類似,段也存在INODE Entry,組成如下

image.png

  • Segment ID

就是指這個INODE Entry結構對應的段的編號(ID)。

  • NOT_FULL_N_USED

這個字段指的是在NOT_FULL鏈表中已經使用了多少個頁面。

  • 3個List Base Node

分別為段的FREE鏈表、NOT_FULL鏈表、FULL鏈表定義的List Base Node,這樣我們想查找某個段的某個鏈表的頭節點和尾節點的時候,就可以直接到這個部分找到對應鏈表的List Base Node。

  • Magic Number:

這個值是用來標記這個INODE Entry是否已經被初始化了(初始化的意思就是把各個字段的值都填進去了)。如果這個數字是值的97937874,表明該INODE Entry已經初始化,否則沒有被初始化。。

  • Fragment Array Entry

我們前邊強調過無數次段是一些零散頁面和一些完整的區的集合,每個Fragment Array Entry結構都對應著一個零散的頁面,這個結構一共4個字節,表示一個零散頁面的頁號

3.FSP_HDR(第一組前3個頁面之一)

這個頁面的類型是FSP_HDR,它存儲了表空間的一些整體屬性以及第一個組內256個區的對應的XDES Entry結構
image.png

由圖可得,這個頁面由五部分組成

3.1 File Header

記錄頁的一些通用信息

3.2 File Space Header

表空間的一些整體屬性信息

  • Space ID 4字節 表空間的ID
  • Not Used 4字節 這4個字節未被使用,可以忽略
  • Size 4字節 當前表空間占有的頁面數
  • FREE Limit 4字節 尚未被初始化的最小頁號,大于或等于這個頁號的區對應的XDES Entry結構都沒有被加入FREE鏈表
  • Space Flags 4字節 表空間的一些占用存儲空間比較小的屬性
  • FRAG_N_USED 4字節 FREE_FRAG鏈表中已使用的頁面數量
  • List Base Node for FREE List 16字節 FREE鏈表的基節點
  • List Base Node for FREE_FRAG List 16字節 FREE_FRAG鏈表的基節點
  • List Base Node for FULL_FRAG List 16字節 FULL_FRAG鏈表的基節點
  • Next Unused Segment ID 8字節 當前表空間中下一個未使用的 Segment ID
  • List Base Node for SEG_INODES_FULL List 16字節 SEG_INODES_FULL鏈表的基節點
  • List Base Node for SEG_INODES_FREE List 16字節 SEG_INODES_FREE鏈表的基節點

3.3 XDES Entry

在這部分保存的就是一整個組(256個區)的XDES Entry,

3.4 Empty Space

用于頁結構的填充,沒啥實際意義

3.5 File Trailer

校驗頁是否完整

4.INODE(第一組前3個頁面之一)

這個INODE類型的頁就是為了存儲INODE Entry結構而存在的

image.png
結構上與XDES大體相同,但是引入了List Node for INODE Page List

4.1 List Node for INODE Page List

每個INODE Entry結構占用192字節,一個頁面里可以存儲85個這樣的結構。但是一個表空間中可能存在超過85個段,所以可能一個INODE類型的頁面不足以存儲所有的段對應的INODE Entry結構,所以就需要額外的INODE類型的頁面來存儲這些結構。于是引入了List Node for INODE Page List:

  • SEG_INODES_FULL鏈表:該鏈表中的INODE類型的頁面中已經沒有空閑空間來存儲額外的INODE Entry結構了。

  • SEG_INODES_FREE鏈表:該鏈表中的INODE類型的頁面中還有空閑空間來存儲額外的INODE Entry結構了。

因此插入INODE Entry時

  1. 先看看SEG_INODES_FREE鏈表是否為空,如果不為空,直接從該鏈表中獲取一個節點,也就相當于獲取到一個仍有空閑空間的INODE類型的頁面,然后把該INODE Entry結構放到該頁面中。當該頁面中無剩余空間時,就把該頁放到SEG_INODES_FULL鏈表中。

  2. 如果SEG_INODES_FREE鏈表為空,則需要從表空間的FREE_FRAG鏈表中申請一個頁面,修改該頁面的類型為INODE,把該頁面放到SEG_INODES_FREE鏈表中,與此同時把該INODE Entry結構放入該頁面。

5. XDES類型(每組前2個頁面之一)

FSP_HDR類型的頁面對比,除了少了File Space Header部分之外,也就是除了少了記錄表空間整體屬性的部分之外,其余的部分是一樣一樣的。

image.png

6. Segment Header

Page Header部分存在

  • PAGE_BTR_SEG_LEAF 10字節 B+樹葉子段的頭部信息,僅在B+樹的根頁定義
  • PAGE_BTR_SEG_TOP 10字節 B+樹非葉子段的頭部信息,僅在B+樹的根頁定義
    二者的10字節其實對應Segment Header結構

image.png
PAGE_BTR_SEG_LEAF記錄著葉子節點段對應的INODE Entry結構的地址是哪個表空間的哪個頁面的哪個偏移量,PAGE_BTR_SEG_TOP記錄著非葉子節點段對應的INODE Entry結構的地址是哪個表空間的哪個頁面的哪個偏移量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391141.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

神經網絡推理_分析神經網絡推理性能的新工具

神經網絡推理Measuring the inference time of a trained deep neural model on different hardware devices is a critical task when making deployment decisions. Should you deploy your inference on 8 Nvidia V100s, on 12 P100s, or perhaps you can use 64 CPU cores?…

Eclipse斷點調試

1.1 Eclipse斷點調試概述Eclipse的斷點調試可以查看程序的執行流程和解決程序中的bug1.2 Eclipse斷點調試常用操作:A:什么是斷點:就是一個標記,從哪里開始。B:如何設置斷點:你想看哪里的程序,你就在那個有效程序的左邊雙擊即可。C…

react部署在node_如何在沒有命令行的情況下在3分鐘內將React + Node應用程序部署到Heroku

react部署在nodeIn this tutorial we will be doing a basic React Node app deploy to Heroku. 在本教程中,我們將進行基本的React Node應用程序部署到Heroku。 There are a lot of tutorials that do this only using the command line, so to change things u…

深入理解InnoDB(7)—系統表空間

系統表空間 可以看到,系統表空間和獨立表空間的前三個頁面(頁號分別為0、1、2,類型分別是FSP_HDR、IBUF_BITMAP、INODE)的類型是一致的,只是頁號為3~7的頁面是系統表空間特有的 頁號3 SYS: Insert Buffer …

CodeForces - 869B The Eternal Immortality

題意&#xff1a;已知a,b&#xff0c;求的最后一位。 分析&#xff1a; 1、若b-a>5&#xff0c;則尾數一定為0&#xff0c;因為連續5個數的尾數要么同時包括一個5和一個偶數&#xff0c;要么包括一個0。 2、若b-a<5&#xff0c;直接暴力求即可。 #include<cstdio>…

如何在24行JavaScript中實現Redux

90% convention, 10% library. 90&#xff05;的慣例&#xff0c;10&#xff05;的圖書館。 Redux is among the most important JavaScript libraries ever created. Inspired by prior art like Flux and Elm, Redux put JavaScript functional programming on the map by i…

卡方檢驗 原理_什么是卡方檢驗及其工作原理?

卡方檢驗 原理As a data science engineer, it’s imperative that the sample data set which you pick from the data is reliable, clean, and well tested for its usability in machine learning model building.作為數據科學工程師&#xff0c;當務之急是從數據中挑選出的…

Web UI 設計(網頁設計)命名規范

Web UI 設計命名規范 一.網站設計及基本框架結構: 1. Container“container“ 就是將頁面中的所有元素包在一起的部分&#xff0c;這部分還可以命名為: “wrapper“, “wrap“, “page“.2. Header“header” 是網站頁面的頭部區域&#xff0c;一般來講&#xff0c;它包含…

leetcode 1486. 數組異或操作(位運算)

給你兩個整數&#xff0c;n 和 start 。 數組 nums 定義為&#xff1a;nums[i] start 2*i&#xff08;下標從 0 開始&#xff09;且 n nums.length 。 請返回 nums 中所有元素按位異或&#xff08;XOR&#xff09;后得到的結果。 示例 1&#xff1a; 輸入&#xff1a;n …

27個機器學習圖表翻譯_使用機器學習的信息圖表信息組織

27個機器學習圖表翻譯Infographics are crucial for presenting information in a more digestible fashion to the audience. With their usage being expanding to many (if not all) professions like journalism, science, and research, advertisements, business, the re…

在HTML中使用javascript (js高級程序設計)

在HTML中使用javascript 剛開始入門的時候覺得關于應用以及在html中只用javascript很簡單&#xff0c;不需要進行學習。我又開始重溫了一下紅寶書&#xff0c;覺得還是有必要進行學習的。這是一個筆記&#xff01; script 元素插入有多種方式 屬性使用方式async延遲腳本&#x…

大數據新手之路二:安裝Flume

Ubuntu16.04Flume1.8.0 1.下載apache-flume-1.8.0-bin.tar.gz http://flume.apache.org/download.html 2.解壓到/usr/local/flume中 3.設置配置文件/etc/profile文件&#xff0c;增加flume的路徑 ①vi /etc/profile export FLUME_HOME/usr/local/flume export PATH$PATH:$FLUME…

leetcode 1723. 完成所有工作的最短時間(二分+剪枝+回溯)

給你一個整數數組 jobs &#xff0c;其中 jobs[i] 是完成第 i 項工作要花費的時間。 請你將這些工作分配給 k 位工人。所有工作都應該分配給工人&#xff0c;且每項工作只能分配給一位工人。工人的 工作時間 是完成分配給他們的所有工作花費時間的總和。請你設計一套最佳的工作…

異步解耦_如何使用異步生成器解耦業務邏輯

異步解耦Async generators are new in JavaScript. They are a remarkable extension. They provide a simple but very powerful tool for splitting programs into smaller parts, making sources easier to write, read, maintain and test.異步生成器是JavaScript中的新增功…

函數的定義,語法,二維數組,幾個練習題

1、請將’A’,’B’,’C’存入數組&#xff0c;然后再輸出2、請將”我” “愛” “你”存入數組&#xff0c;然后正著和反著輸出3、輸入10個整數存入數組&#xff0c;然后復制到b數組中輸出4、定義一個長度為10的數組&#xff0c;循環輸入10個整數。 然后將輸入一個整數&#x…

leetcode 1482. 制作 m 束花所需的最少天數(二分查找)

給你一個整數數組 bloomDay&#xff0c;以及兩個整數 m 和 k 。 現需要制作 m 束花。制作花束時&#xff0c;需要使用花園中 相鄰的 k 朵花 。 花園中有 n 朵花&#xff0c;第 i 朵花會在 bloomDay[i] 時盛開&#xff0c;恰好 可以用于 一束 花中。 請你返回從花園中摘 m 束…

算法訓練營 重編碼_編碼訓練營手冊:沉浸式工程程序介紹

算法訓練營 重編碼Before you spend thousands of dollars and several months of your life on a coding bootcamp, spend 30 minutes reading this handbook.在花費數千美元和一生中的幾個月時間參加編碼訓練營之前&#xff0c;請花30分鐘閱讀本手冊。 這本手冊適用于誰&…

面向Tableau開發人員的Python簡要介紹(第4部分)

用PYTHON探索數據 (EXPLORING DATA WITH PYTHON) Between data blends, joins, and wrestling with the resulting levels of detail in Tableau, managing relationships between data can be tricky.在數據混合&#xff0c;聯接以及在Tableau中產生的詳細程度之間進行搏斗之間…

bzoj 4552: [Tjoi2016Heoi2016]排序

Description 在2016年&#xff0c;佳媛姐姐喜歡上了數字序列。因而他經常研究關于序列的一些奇奇怪怪的問題&#xff0c;現在他在研究一個難題&#xff0c;需要你來幫助他。這個難題是這樣子的&#xff1a;給出一個1到n的全排列&#xff0c;現在對這個全排列序列進行m次局部排序…

oracle之 手動創建 emp 表 與 dept 表

說明&#xff1a; 有時候我們需要通用的實驗數據&#xff0c;emp表 與 dept表 但是數據庫中有沒有。 這時&#xff0c;我們可以手動創建。 -- 創建表與數據CREATE TABLE EMP(EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, S…