MySQL學習(5)記錄存在那裡——表空間

来源:https://www.cnblogs.com/haleyeung/archive/2023/10/13/17763531.html
-Advertisement-
Play Games

前言 存儲引擎都是把數據存儲在文件系統上,通過通過查詢命令,可以查看數據目錄所在的本機路徑。 mysql> SHOW VARIABLES LIKE 'datadir'; + + + | Variable_name | Value | + + + | datadir | /var/lib/mysql/ ...


前言

存儲引擎都是把數據存儲在文件系統上,通過通過查詢命令,可以查看數據目錄所在的本機路徑。

mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

每個資料庫都在數據目錄下有一個同名子目錄,這是在新建資料庫時,MySQL自動創建的。在資料庫名對應的子目錄下,每一張數據表都有一個同名以尾碼名為.frm的文件,這個文件存儲了表結構的定義。在InnoDB存儲引擎中,表的數據存儲在一個叫表空間的地方。

InnoDB頁和表的關係

我們知道記錄是保存在索引頁中的,InnoDB為了管理這些頁,提出了表空間的概念。本質上就是磁碟上的一個或多個文件。每一個表空間可以被劃分成很多頁。

根據表空間的類型可以劃分為如下:

  1. 系統表空間

InnoDB在數據目錄創建的名為ibdata1的文件,這個文件可以自己擴展大小。一個MySQL進程只有一個系統表空間,其中記錄了一些與整個系統相關的信息。

  1. 獨立表空間

在資料庫同名的子目錄中,每一張數據表都有一個同名以尾碼名為.ibd的文件。它與.frm文件共同分別存儲了表的結構和記錄。

獨立表空間結構

什麼是區(extent)

表空間中連續的64個頁就是一個區,也就是一個區預設占用1MB空間。無論是系統表空間還是獨立表空間,都可以看成是若幹個連續的區組成,每256個區為一組。

如下extent0-extent255位一組,extent256-extent511位一組,以此類推。

每個組頭幾個頁

第一組前面3個頁始終是這三種頁:

  • FSP_HDR:用於記錄表空間的一些屬性以及本組所有區的XDES Entry數據結構,也就是有256個。

  • IBUF_BITMAP:存儲Change Buffer的一些信息。

  • INODE:存儲了若幹INODE Entry數據結構。

其餘組前2個頁始終是這兩種:

  • XDES:存儲本組所有區的XDES Entry數據結構。

  • IBUF_BITMAP:同上。

什麼是段(segment)

同一個索引的B+樹結構中,目錄項所在的頁,也就是非葉子節點所在的區的集合為一個段,葉子節點所在的區的集合為一個段。一個索引會生成兩個段,一個葉子節點段和一個非葉子節點段。

表中數據較少時,每次新插入一條記錄,都會被插入到一個碎片區中,當使用了32個碎片區中的頁後,會分配一個完整的區,原先碎片區中的頁不會被覆制到新的完整的區中。因此段是某些零散頁面以及一些完整的區的集合

什麼是碎片區(fragment)

碎片區也是由64個頁組成,只屬於表空間。結構上和其他的區沒有啥不同。碎片區中的頁用於不同目的,不限制於某個索引的某個段。有些頁屬於段A,有些頁屬於段B。

區的分類

4種類型:

  • 空閑的區(FREE)

  • 有剩餘空閑頁面的碎片區(FREE_FRAG)

  • 沒有剩餘空閑頁面的碎片區(FULL_FRAG)

  • 屬於某個段段區(FSEG)

其中FREE、FREE_FRAG和FULL_FRAG獨立且直屬於表空間;FSEG屬於某個段。

什麼是XDES Entry

XDES Entry是一種用於更好管理區的數據結構,每個區都對應一個XDES Entry結構,這個結構存放在每個組都FSP_HDR或XDES頁中。

XDES Entry結構示意圖

每個XDES Entry由40個位元組構成,分為4個部分。

  • Segment ID表示所屬段的編號,若不屬於任何段,這個屬性無意義。

  • List Node包含前一個XDES Entry和後一個XDES Entry的指針,通過這些指針可以構成雙向鏈表結構。

  • State的值表示這個區的狀態,也就是FREE、FREE_FRAG、FULL_FRAG或FSEG。

  • Page State Bitmap共16個位元組,合128比特位,沒兩個比特位代表一個頁。其中第1位表示對應的頁是否空閑。

什麼是XDES Entry鏈表

利用XDES Entry中的List Node,將相同類型的區串成雙向鏈表,這麼做的好處是減少隨機I/O,又不至於讓數據少的表浪費空間,避免每次想找到一種類型的區時要遍歷所有的區。

  • FREE鏈表,包含不屬於任何段,且所有頁面都是空閑頁面的區

  • FREE_FRAG鏈表,包含不屬於任何段,且有剩餘空閑頁面的區

  • FULL_FRAG鏈表,包含不屬於任何段,且沒有剩餘空閑頁面的區

屬於某個段的區中會根據List Node串成三種鏈表:

  • FREE鏈表,包含同一個段中,所有頁main都是空閑頁面的區

  • NOT_NULL鏈表,包含同一個段中,存在空閑頁面的區

  • FULL鏈表,包含同一個段中,已經沒有空閑頁面的區

插入記錄流程如下所示:

InnoDB表空間插入記錄流程圖

每一個鏈表的頭節點和尾節點以及這個鏈表中包含了多少個節點的信息被記錄在一個叫List Base Node鏈表基節點的結構中,占用16個位元組。

碎片區中的鏈表基節點存放在FSP_HDR頁中的File Space Header中,附屬於段的鏈表基節點存放在INODE Entry結構中。

什麼是INODE Entry

段不同於區,它是一個邏輯概念,由若幹個零散頁面和一些完整的區組成。與XDES Entry類似,每一個段有一個INODE Entry結構,存放在表空間第一組的INODE頁。

INODE Entry結構如下:

INODE Entry結構示意圖

  • Segment ID:段編號

  • NOT_FULL_N_USED:NOT_FULL鏈表中已經使用了頁面數量

  • List Base Node For FREE List:FREE鏈表的基節點。

  • List Base Node For NOTE_FULL List:NOT_FULL鏈表的基節點。

  • List Base Node For FULL List:FULL鏈表的基節點。

  • Magic Number:用來標記這個INODE Entry是否已經被初始化,也就是把各個欄位的信息都填上了。該值為97937874,表明該INODE Entry已被初始化,否則沒有被初始化。

  • Fragment Array Entry:32個,對應著屬於該段的零散頁面的頁號。

直屬於表空間的區,每個區對應一個XDES Entry,根據區的狀態分別建立3個鏈表,鏈表基節點存放在FSD_HDR頁。附屬於段段區,根據頁面空閑狀態,分別建立3個鏈表,鏈表基節點存放在INODE Entry。

什麼是FSP_HDR頁

一個表空間只有一個FSP_HDR頁,其結構如下:

FSP_HDR頁結構示意圖

File Header、File Trailer與其他類型的頁類似,主要關註File Space Header和XDES Entry。

  1. File Space Header部分

File Space Header結構如下:

FIle Space Header結構示意圖

  • Space ID欄位表示表空間編號。

  • Size欄位表示當前表空間擁有的頁面數。

  • FREE Limit欄位表示未被初始化的最小頁號。空間增大時,不會立即將空閑空間加入到FREE鏈表,只將一部分加入到FREE鏈表,等FREE鏈表中的XDES Entry對應的區不夠用時,再把沒有加入FREE鏈表的區對應的XDES Entry加入到FREE鏈表,FREE Limit表示還未加入到FREE鏈表的最小頁號。

  • Space Flags表示表空間中的一些狀態屬性。

  • FRAG_N_USED欄位表示FREE_FRAG鏈表中已經使用的頁面數量。

  • List Base Node for FREE List、List Base Node for FREE_FRAG List、List Base Node for FULL_FRAG List著3個欄位分別表示FREE鏈表、FREE_FRAG鏈表和FULL_FRAG鏈表的基節點。使得定位鏈表更容易。

  • NEXT Unused Segment ID欄位表示下一個新建段的ID,類似於自增主鍵。

  • List Base Node for SEG_INODES_FULL欄位表示SEG_INODES_FULL鏈表的基節點。

  • List Base Node for SEG_INDOES_FREE欄位表示SEG_INODES_FREE鏈表的基節點。

  1. XDES Entry部分

每個區對應一個XDES Entry結構,一個XDES Entry占用40個位元組,一個組有256個組,表空間第一組中的所有區對應的XDES Entry就存儲在FSP_HDR頁的XDES Entry部分中。

什麼是XDES頁

XDES頁和FSP_HDR頁結構相似,區別在於XDES頁沒有了FIle Space Header部分。功能就是存儲本組中所有區對應的256個XDES Entry。

什麼是IBUF_BITMAP頁

每個組第二個頁都是IBUF_BITMAP,這種類型的頁記錄了有關Change Buffer的東西。

Change Buffer本質是表空間中的一顆B+樹,它的根節點存儲在系統表空間中。在修改非唯一二級索引頁面時,如果該頁尚未被載入到記憶體,那麼該修改將被暫時緩存在Change Buffer中,之後伺服器空閑或載入了該頁到記憶體中,再將修改和冰島該頁面。

什麼是INODE頁

第一個分組中第三個頁面的類型是INODE,其結構如下:

INODE頁結構示意圖

List Node for INODE Page List為前一個INODE頁和後一個INODE頁的指針,每個段對應的INODE Entry結構會急中存放在INODE頁中,每個INODE Entry占用192位元組,一個INODE頁可以存放85個INODE Entry結構。如果表中索引特別多,每個索引對應兩個段,所以一個INODE頁不夠用,就會使用多個INODE頁來進行存儲。這些INODE頁會形成兩個鏈表。

  • SEG_INODES_FULL鏈表:已經沒有空閑空間用來存儲INODE Entry的INODE頁所建立的鏈表。

  • SEG_INODES_FREE鏈表:還有剩餘空間用來存儲INODE Entry的INODE頁所建立的鏈表。

什麼是Segment Header

為了知道某個段對應哪個INODE Entry結構,在段中的記錄所在的頁,也就是INDEX頁Page Header部分有這樣兩個屬性:

名稱大小描述
PAGE_BTR_SEG_LEAF 10位元組 B+樹葉子節點段段頭部信息,僅在B+樹段根頁中定義
PAGE_BTR_SEG_TOP 10位元組 B+樹非葉子節點段的頭部信息,僅在B+樹的根頁中定義

這10個位元組對應的是一個Segment Header結構:

名稱大小描述
Space ID for INODE Entry 4位元組 INODE Entry結構所在的表空間ID
Page Number of the INODE Entry 4位元組 INODE Entry結構所在的頁面頁號
Byte Offset of the INODE Entry 2位元組 INODE Entry結構在該頁中偏移量

這樣,PAGE_BTR_SEG_LEAF記錄著葉子節點段對應的INODE Entry結構的地址,PAGE_BTR_SEG_TOP記錄著非葉子節點對應的INODE Entry結構的地址。一個索引值對應兩個段,所在只需要在索引的根頁面記錄這兩個結構即可。

 

閱讀學習自《MySQL是怎樣運行的》小孩子4919


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 但近期部署系統和自己的開發項目時,發現debian系統安裝框架還是非常方便,我就把自己整理的常規部署命令貼出來,希望對大家有用處,基本對.NET CORE的開發者足夠用了 ...
  • 不知道大家有沒有瞭解FreeSSL,我近期發展這個網站 https://freessl.cn,如果你們都是個人站點,對證書沒什麼特別要求,可以考慮用他們家生成的證書,並且能自動續費,完全不用操心。 ...
  • 一 .netframework程式遷移到.netcore5.0對於.netframwork程式想要升級為.netcore5.0的方法,微軟官方也給出了方法見 https://docs.microsoft.com/en-us/dotnet/desktop/winforms/migration/?vie ...
  • C#核心 面向對象--封裝 用程式來抽象現實世界,(萬物皆對象)來編程實現功能。 三大特性:封裝、繼承、多態。 類與對象 聲明位置:namespace中 樣式:class 類名{} 命名:帕斯卡命名法(首字母大寫) 實例化對象:根據類來新建一個對象。Person p=new Person(); 成員 ...
  • <工作記錄——Report> 報表前的數據獲取操作是高重覆性的,今天差不多完成了腳本,下述是代碼: 1 // See https://aka.ms/new-console-template for more information 2 using System.IO; 3 using System. ...
  • 目錄一、微處理器與匯流排1.微處理器的概述1.1 運算器1.2 控制器1.2.1 指令控制1.2.2 時序控制1.2.3 操作控制二、8086/8088微處理器1.8086/8088CPU的指令特點1.1 指令流水線1.2 記憶體的分段管理技術1.3 支持多處理器系統2.8088/8086的外部引腳及其 ...
  • 本腳本通過域管下發預設為root許可權執行 #!/bin/bash cd /home #快捷方式圖標名稱 string_imgName="temp1.png" #快捷方式文件名稱 string_fileName="/changePassword.desktop" #快捷方式內容 function in ...
  • Tcpdump 抓包工具使用以及Wireshark解析pacp包 參考鏈接(比較詳細):https://blog.csdn.net/weixin_42866036/article/details/128004750 1.項目上數據在共用時,由於介面有Token鑒權動作,有時調用介面會出現鑒權失效問題 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...