【MySQL】頁結構詳解:頁的大小、分類、頭尾信息、數據行、查詢、記錄及數據頁的完整結構

📢博客主頁:https://blog.csdn.net/2301_779549673
📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
📢本文由 JohnKi 原創,首發于 CSDN🙉
📢未來很長,值得我們全力奔赴更美好的生活?

在這里插入圖片描述

在這里插入圖片描述

文章目錄

  • 🏳??🌈一、頁的大小可以設置嗎?
  • 🏳??🌈二、頁都有哪些分類? 我們需要重點學習哪種頁?
  • 🏳??🌈三、頁頭和頁尾具體包含了哪些信息?
    • 3.1 頁頭 - File Header
    • 3.2 頁尾-File Trailer
    • 3.3 什么是 LSN
    • 3.4 除了頁頭和頁尾,數據頁中還有哪些信息?
    • 3.5 頁主體中包含哪些信息?
  • 🏳??🌈四、數據行有哪些信息組成?
    • 4.1 數據行是如何組織在一起的?
    • 4.2 怎么標識新頁中的第一行和最后一行?
    • 4.3 當向一個新頁插入數據時是如何執行的?
  • 🏳??🌈五、如果要查詢的數據在某一個頁中,如何定位它在頁中的位置,一條條遍歷嗎?
    • 5.1 一條條遍歷的查詢效率高不高?
    • 5.2 如何提高頁內的查詢效率?頁目錄
  • 🏳??🌈六、關于事務、索引這些信息在頁中怎么記錄?
  • 🏳??🌈七、數據頁的完整結構是什么樣的?
  • 👥總結


11111111
11111111
11111111
11111111
**** 11111111

MySQL 運行的過程中起到了非常重要的作用,為了能發揮更好的性能,可以結合自己系統的業務場景和數據大小,對頁相關的系統變量進行調整,頁的大小就是一個非常重要的調整項。同時關于頁的結構也要有所了解,以后介紹的索引原理也是基于頁實現的。

首先來看關于頁的幾個問題。

🏳??🌈一、頁的大小可以設置嗎?

  • 前面介紹了每個數據頁默認為 16KB ,是操作系統"數據塊"4KB的整數倍,那么只要保證頁的大小是操作系統"數據塊"大小的整數倍是不是也可以呢,答案是肯定的
  • MySQL提供了一個專門的系統變量來控制頁的大小,可以通過系統變量 innodb_page_size 進行調整與查看,在調整頁大小的時候需要保證設置的值是操作系統"數據塊"4KB的整數倍,從而保證通過操作系統和磁盤交互時"數據塊"的完整性,不被分割或浪費,所以規定了innodb_page_size可以設置的值,分別是4096、8192、16384、3276865536,對應4KB、8KB、16KB、32KB、64KB。

解答問題

可以通過系統變量 innodb_page_size 進行調整與查看,但要保證設置的值是操作系統 "數據塊"4KB 的整數倍,MySQL規定 innodb_page_size 可以設置的值,分別是 40968192、16384、65536,對應4KB、32768、8KB、16KB、32KB、64KB

🏳??🌈二、頁都有哪些分類? 我們需要重點學習哪種頁?

  • InnoDB在不同的使用場景定義多種不同類型的頁,常用的有數據頁、Undo Log頁Change Buffer頁Extent Descriptor(XDES)頁InnoDB段信息頁 等,每種頁的數據結構都不相同,其中最需要我們關注的就是數據頁
  • 由于 InnoDB 中有個概念叫 “索引即數據”,所以也叫做索引頁
  • 不論哪種類型的頁都具有 頁頭(File Header)頁尾(File Trailer) 兩個信息

🏳??🌈三、頁頭和頁尾具體包含了哪些信息?

頁頭 和 頁尾 中包含的是 用來描述文件相關的信息,如下圖所示

在這里插入圖片描述
在這里插入圖片描述

3.1 頁頭 - File Header

  • 頁號: FIL_PAGE_OFFSET 占用 4Byte,相當于頁的身份證號,通過這個長度可以計算出每個InnoDB表中最多可以擁有 2(4*8)-1約42億 個頁,表空間第一個頁編號從0開始,之后的頁號分別是1,2,3…依此類推,具體頁的偏移量計算公式為: 頁號 * 每頁大小; 那么按照每個頁默認16KB大小計算,一個表空間最大容量為2(4*8)*16KB= 64TB,這也是InnoDB表空間最大容量是64T的原因;
  • 上一頁頁號: FIL_PAGE PREV
  • 下一頁頁號: FIL_PAGE_NEXT 多個頁通過這兩個信息組成雙向鏈表,即使不同的頁地址不連續,也可以通過鏈表連接
  • 表空間ID: FIL PAGE_ARCH_LOG_NO_OR_SPACE_ID當前頁屬于哪個表空間
  • 頁類型: FIL_PAGE_TYPE數據頁對應的頁類型是 FIL_PAGEINDEX=0x45BF
  • 最近一次修改的LSN: FIL_PAGE_LSN,占用 8Byte
  • 已被刷到磁盤的LSN: FIL_PAGE_FILE_FLUSH_LSN,占用 8Byte
  • 校驗和: FILPAGELSPACE_OR_CHKSUM用于頁的完整性校驗

3.2 頁尾-File Trailer

  • 近一次修改的LSN
  • 校驗和: 對應頁頭中的校驗和

如果在數據傳輸的過程中數據丟失或異常中斷,導致一個數據頁不完整 可以通過 頁頭頁尾校驗和 進行驗證,驗證算法默認使用 CRC32

3.3 什么是 LSN

LSN: 是"Log Sequence Number"的縮寫,表示日志序號。用 一個任意的、不斷增加的值 表示日志中記錄的操作對應的時間點,用 8字節的無符號長整形 表示,后面會詳細介紹如何生成LSN的值

3.4 除了頁頭和頁尾,數據頁中還有哪些信息?

頁頭和頁尾中的各個字段描述了當前頁的類型以及在文件系統中的位置,也就是說通過頁頭可以找到對應的頁。數據頁的主要功能是保存數據,在一個數據頁中,除了頁頭與頁尾占用的46個字節之外的空間都用來存儲真正的數據,也就是 數據行

數據行會與表里的數據行一一對應,基于這一特性MySQL也被稱為"行式數據庫”,也可以把除了頁頭頁尾的區域稱為頁主體

3.5 頁主體中包含哪些信息?

頁主體中的信息都是和數據相關的,

  • 其中包括剛才提到了 數據行
  • 還有為了提高查詢效率的頁目Page Directory
  • 為了方便操作和管理數據頁的數據頁頭 Page Header

這又是三個非常重要的概念,接下來我們逐個討論。

🏳??🌈四、數據行有哪些信息組成?

數據行主要存儲真實數據,為了方便數據的管理與描述,InnoDB在每個數據行中還添加了一些額外(管理)信息,于是每一個 DYNAMIC 數據行都可以劃分為兩部分,一部分存儲額外信息,一部分存儲真實數據

額外信息部分包含 變長字段長度列表NULL值列表 兩個大小不確定的區域,以及固定占5字節及40BIT的頭信息區域

頭信息 中存儲了行的基本信息,包括行在 頁內的位置heap_no行類型 record_type下一行的地址偏移量 next_record 等6項信息,

如下圖所示:

在這里插入圖片描述
總結

  • 數據行可以劃分為兩部分,一部分存儲額外信息,一部分存儲真實數據
  • 額外信息部分 包含 變長字段長度列表NULL值列表 兩個大小不確定的區域,以及固定占5字節的頭信息區域

4.1 數據行是如何組織在一起的?

數據行通過下一行的地址偏移量,即 next_record 將頁內所有數據行組成了一個單向鏈表

這里要注意的是,地址偏移量 指向的是 下一行中真實數據的起始地址,這樣做的好處是,向右是真實數據,向左就是頭信息,而無需額外的長度計算,如圖所示:

在這里插入圖片描述

在這里插入圖片描述

4.2 怎么標識新頁中的第一行和最后一行?

了解了行的基本結構和組織方式之后,那么當遍歷頁中的行時,從哪里開始到哪里結束呢?

為了解決這個問題,每當創建一個新頁,都會自動分配兩個行,

  • 一個是行類型為2的 最小行 Infimun, heap_no 位置固定為0號
  • 一個是行類型為3的 最大行 Supremun, heap_no 位置固定為1號

這兩個行并不存儲任何真實信息,而是做為數據行鏈表的頭和尾

雖然不存儲真實數據,但它們的數據結構和真實數據行完全一致,只不過數據區域存儲的是代表它們身份的固定字符串 InfimunSupremun,新頁中沒有數據時,最小行 Infimunnext record 直接連接最大行 Supremun最大行不連接任何行,它的 next_record0

在這里插入圖片描述

4.3 當向一個新頁插入數據時是如何執行的?

當向一個新頁插入數據時,heap_no 會 從2號開始遞增,表示當前記錄在頁面堆中的相對位置;

  • 如果是真實數據record_type0
  • 如果是索引目錄(B+樹非葉節點)數據則 record_type1

再將 Infimun 連接第一個數據行,最后一行真實數據行連接 Supremun這樣數據行就構建成了一個單向鏈表

更多的行數據插入后,會按照主鍵從小到大的順序進行鏈接;

為了使頁的結構更加清晰,通常

  • 將頁中有數據行的區域稱為 用戶數據區 userRecords
  • 把未被數據行占用的區域稱為 空閑區Free Space

如下圖所示:

在這里插入圖片描述

🏳??🌈五、如果要查詢的數據在某一個頁中,如何定位它在頁中的位置,一條條遍歷嗎?

當然不是,InnoDB使用了另一種方式,更高效的查詢數據,下面我們分析一下。

5.1 一條條遍歷的查詢效率高不高?

從頭開始遍歷是一個最簡單的方法,也可以實現數據的查找,當按主鍵或索引查找某條數據時,從頭行 infimun 開始,沿著鏈表順序逐個比對查找,但一個頁有16KB,通常會存在數百行數據,每次都要遍歷數百行,無法滿足高效查詢。

5.2 如何提高頁內的查詢效率?頁目錄

為了提高查詢效率,InnoDB 采用 二分查找 來解決查詢效率問題。

具體實現方式是,在每一個頁中加入一個叫做 頁目錄 Page Directory 的結構將頁內包括頭行、尾行在內的所有行進行分組,約定頭行單獨為一組其他每個組最多8條數據,同時把每個組最后一行在頁中的地址,按主鍵從小到大的順序記錄在頁目錄中

頁目錄中的每一個位置稱為一個,每個槽都對應了一個分組,這樣在插入數據行完成鏈接后,一旦最后一個分組中的數據行超過分組的上限8個時,就會分裂出一個新的分組,為了快速判斷每個分組是否達到了8個的上限,在每個分組最后一行中用 n_owned 記錄了這個分組內的行數,與此同時在頁目錄中創建一個新的槽,后續插入的行都遵守這個規則;

后續在查詢某行時,就可以通過二分查找,先找到對應的槽,然后在槽內最多8個數據行中進行歷即可,從而大幅提高了查詢效率;

例如要查找主鍵為6的行,先比對槽中記錄的主鍵值,定位到最后一個槽2,再從最后一個槽中的第一條記錄遍歷,第二條記錄就是我們要查詢的目標行。
在這里插入圖片描述

🏳??🌈六、關于事務、索引這些信息在頁中怎么記錄?

在這里插入圖片描述

🏳??🌈七、數據頁的完整結構是什么樣的?

這個問題是對頁結構的總結性描述,這里也用一張圖就可以明確的表示出頁結構的整體信息
注意: 這里講的是 InnoDB 的數據頁結構,和 MyISAM 的頁結構有所不同

在這里插入圖片描述


👥總結

本篇博文對 【MySQL】頁結構詳解:頁的大小、分類、頭尾信息、數據行、查詢、記錄及數據頁的完整結構 做了一個較為詳細的介紹,不知道對你有沒有幫助呢

覺得博主寫得還不錯的三連支持下吧!會繼續努力的~

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

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

相關文章

【FreeRTOS】基于G431+Cubemx自用筆記

系列文章目錄 留空 文章目錄 系列文章目錄前言一、從頭開始創建一個FreeRTOS工程1.1 在 "Timebase Source" 中,選擇其他TIM1.2 配置FreeRTOS的參數1. 3 添加任務 二、動態任務的創建/刪除2.1 函數介紹2.1.1 創建動態任務xTaskCreate()2.1.2 創建靜態任務…

LVGL(lv_bar進度條)

文章目錄 一、lv_bar 是什么?二、基本使用創建一個進度條設置進度值 三、條形方向與填充方向四、范圍模式(Range)五、事件處理(可選)六、自定義樣式(可選)七、綜合示例八、配合 lv_timer 或外部…

AI對話小技巧

角色設定:擅于使用 System 給 GPT 設定角色和任務,如“哲學大師"指令注入:在 System 中注入常駐任務指令,如“主題創作"問題拆解:將復雜問題拆解成的子問題,分步驟執行,如&#xff1a…

C++ 核心基礎:數字、數組、字符串、指針與引用詳解

C++ 核心基礎:數字、數組、字符串、指針與引用詳解 1. C++ 基礎語法1.1 標識符與保留字1.2 數據類型概述1.3 基本輸入輸出2.1 基本整數類型(int、short、long、long long)2.2 無符號整數類型(unsigned int、unsigned short、unsigned long、unsigned long long)2.3 整數類…

HarmonyOS運動開發:如何集成百度地圖SDK、運動跟隨與運動公里數記錄

前言 在開發運動類應用時,集成地圖功能以及實時記錄運動軌跡和公里數是核心需求之一。本文將詳細介紹如何在 HarmonyOS 應用中集成百度地圖 SDK,實現運動跟隨以及運動公里數的記錄。 一、集成百度地圖 SDK 1.引入依賴 首先,需要在項目的文…

如何理解k8s中的controller

一、基本概念 在k8s中,Controller(控制器)是核心組件之一,其負責維護集群狀態并確保集群內的實際狀態與期望狀態一致的一類組件。控制器通過觀察集群的當前狀態并將其與用戶定義的期望狀態進行對比,做出相應的調整來實…

《Go小技巧易錯點100例》第三十二篇

本期分享: 1.sync.Map的原理和使用方式 2.實現有序的Map sync.Map的原理和使用方式 sync.Map的底層結構是通過讀寫分離和無鎖讀設計實現高并發安全: 1)雙存儲結構: 包含原子化的 read(只讀緩存,無鎖快…

【MySQL】行結構詳解:InnoDb支持格式、如何存儲、頭信息區域、Null列表、變長字段以及與其他格式的對比

📢博客主頁:https://blog.csdn.net/2301_779549673 📢博客倉庫:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正! &…

LabVIEW多通道并行數據存儲系統

在工業自動化監測、航空航天測試、生物醫學信號采集等領域,常常需要對多個傳感器通道的數據進行同步采集,并根據后續分析需求以不同采樣率保存特定通道組合。傳統單線程數據存儲方案難以滿足實時性和資源利用效率的要求,因此設計一個高效的多…

【Linux系列】bash_profile 與 zshrc 的編輯與加載

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

針對Mkdocs部署到Githubpages加速訪問速度的一些心得

加速網站訪問的一些心得 在使用 MkDocs 構建網站時,為了提高訪問速度,我們可以采取以下一些措施: 1. 優化圖片 使用合適的圖片格式,如 WebP、JPEG2000 等,減少圖片文件大小,從而加快加載速度。 可以使用…

Mysql中切割字符串作為in的查詢條件

問題:需要將一個字符串切割成數組作為in的查詢條件,如: select * from table_1 where name in (select slit(names) from table_2 where id 3); names 返回的格式是’name1,name2,name3…,需要將name按照逗號切割作為in的查詢條件&#xff1b…

云計算中的虛擬化:成本節省、可擴展性與災難恢復的完美結合

云計算中虛擬化的 4 大優勢 1. 成本效益 從本質上講,虛擬化最大限度地減少了硬件蔓延。團隊可以將多個虛擬機整合到單個物理主機上,而不是為每個工作負載部署單獨的服務器。這大大減少了前期硬件投資和持續維護。 結果如何?更低的功耗、更低…

Linux : 多線程【線程概念】

Linux : 多線程【線程概念】 (一)線程概念線程是什么用戶層的線程linux中PID與LWP的關系 (二) 進程地址空間頁表(三) 線程總結線程的優點線程的缺點線程異常線程用途 (一)線程概念 線程是什么 在一個程序里的一個執行…

IDEA轉戰TREA AI IDE : springboot+maven+vue項目配置

一、trea下載安裝 Trae官方網址: https://www.trae.com.cn/ Trae官方文檔:https://docs.trae.com.cn/docs/what-is-trae?_langzh w3cschool: https://www.w3cschool.cn/traedocs/ai-settings.html 安裝這里省略,正常安裝即可。…

Java--圖書管理系統(簡易版)

目錄 目錄 前言 🔔1.library包 1.1 Book類 1.2 BookList類 🔔2.user包 2.1User類(父類) 2.2Admin(管理員) 2.3 NormalUser(普通用戶) 🔔3.Operation包 🕐3.1 IOperation接口 🕑3.2ListOperation(查看操作)…

深入淺出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系統開發中,服務間通信是常見需求。作為 Spring 框架的重要組件,RestTemplate 為開發者提供了簡潔優雅的 HTTP 客戶端解決方案。本文將從零開始講解 RestTemplate 的核心用法,并附贈真實地圖 API 對接案例。 一、環境準備 在 Spring…

大數據處理利器:Hadoop 入門指南

一、Hadoop 是什么?—— 分布式計算的基石 在大數據時代,處理海量數據需要強大的技術支撐,Hadoop 應運而生。Apache Hadoop 是一個開源的分布式計算框架,致力于為大規模數據集提供可靠、可擴展的分布式處理能力。其核心設計理念是…

685SJBH計量管理系統

摘 要 計量,在我國已有五千年的歷史。計量的發展與社會進步聯系在一起,它是人類文明的重要組成部分。它的發展經歷了古典階段、經典階段和現代階段。而企業的計量管理是對測量數據、測量過程和測量設備的管理。 本系統通過分析現有計量系統的業務邏輯…