mysql-Innodb記錄結構深度解析

Innodb記錄結構

      • InnoDB記錄結構深度解析
        • 一、InnoDB存儲基礎單元:頁(Page)
        • 二、行格式(Row Format)
      • 三、核心行格式詳解
        • 1. Compact行格式
          • 結構組成:
        • 2. Redundant行格式(兼容舊版本)
          • 核心差異:
        • 3. Dynamic與Compressed行格式
        • **適用場景差異**
      • 四、行溢出處理機制
      • 五、關鍵對比與選型建議
      • 六、總結

InnoDB記錄結構深度解析

一、InnoDB存儲基礎單元:頁(Page)
  • 頁大小:默認16KB,是InnoDB磁盤與內存交互的基本單位。

  • 頁作用:所有數據讀寫操作以頁為單位,避免頻繁磁盤IO,提升性能。

二、行格式(Row Format)

InnoDB提供4種行格式:CompactRedundantDynamicCompressed。核心區別在于數據存儲方式和溢出處理機制。


三、核心行格式詳解

1. Compact行格式

在這里插入圖片描述

結構組成:
  1. 變長字段長度列表(Variable-Length Field Length List)

    1. 逆序存儲:所有變長字段(如VARCHAR)的真實數據長度按列順序逆序存放。

    2. 長度表示規則

  • 若最大長度 ≤ 255字節,用1字節表示實際長度。

  • 若最大長度 > 255字節,根據實際長度選擇1或2字節(L≤127用1字節,L>127用2字節)。

  1. NULL值列表(NULL Value List)

    1. 二進制位圖:每個允許NULL的列對應1位(1表示NULL,0非NULL),按列逆序排列。

    2. 字節對齊:不足8位補0,例如3個NULL列用1字節(二進制高位補0)。

  2. 記錄頭信息(Record Header)

    1. 固定5字節,關鍵標志位:
  • delete_mask:標記記錄是否被刪除。

  • next_record:下一條記錄的相對位置(鏈表結構)。

  • record_type:記錄類型(0-普通,1-B+樹非葉節點,2-最小記錄,3-最大記錄)。

  1. 真實數據(Real Data)

    1. 隱藏列:自動添加row_id(可選)、transaction_id(事務ID)、roll_pointer(回滾指針)。

    2. CHAR(M)存儲

  • 定長字符集(如ascii):固定占用M×字符字節,不足填充空格。

  • 變長字符集(如utf8):長度存入變長字段列表,至少占用M字節。

相比redundant的改進:

  • Compact僅存儲非NULL變長字段的實際字節長度(逆序排列),redundant存儲所有字段偏移地址

  • Compact使用位圖標記NULL列(每列1位),例如3個允許NULL的列僅需1字節存儲狀態。Redundant則通過偏移量高位標記NULL,每個允許NULL的列需額外占用偏移量空間

  • Compact頭信息5字節 包含delete_maskrecord_type等核心字段,支持更細粒度的記錄管理。redundant頭信息6字節,額外包含n_field(列數量)和1byte_offs_flag(偏移量字節數標識),缺少record_type字段

  • 發生行溢出:Compact保留768字節前綴,redundant無優化機制直接存額外頁導致更多空間碎片


2. Redundant行格式(兼容舊版本)

在這里插入圖片描述

核心差異:
  • 字段長度偏移列表:所有列(含隱藏列)的結束位置偏移量,逆序存儲,通過差值計算列長。

  • NULL處理:偏移量首比特標記NULL,定長列NULL仍占空間(填充0x00),變長列不占。

  • 記錄頭信息

    • 6字節,含n_field(列數量)和1byte_offs_flag(偏移量字節數標記)。

    • record_type字段。


3. Dynamic與Compressed行格式
  • Dynamic:類似Compact,但所有溢出數據存于溢出頁,僅保留20字節指針。

  • Compressed:在Dynamic基礎上增加頁級壓縮,減少存儲空間。

適用場景差異
  • Dynamic的優勢場景

    • 適用于超長變長字段(如TEXT/BLOB),溢出數據占比高時,減少原始頁空間浪費。

    • 不適用場景:若記錄長度普遍小于頁容量(16KB),Dynamic與Compact性能差異不大。

  • Compressed的優勢場景

    • 適合存儲成本敏感、讀多寫少的場景(如日志歸檔、歷史數據存儲)。

    • 不適用場景:OLTP系統(高頻更新)、或CPU資源緊張時,壓縮開銷可能成為瓶頸。


四、行溢出處理機制

  • 溢出條件:單行數據超過頁大小(16KB)閾值(約768字節后存溢出頁)。

  • 溢出頁管理

    • 僅保留前綴數據(768字節)在本頁,剩余數據存入溢出頁。

    • 通過指針鏈接溢出頁,保證主頁數據連續性。


五、關鍵對比與選型建議

特性CompactRedundantDynamic
變長字段存儲僅變長字段長度列表全字段偏移列表類似Compact
NULL處理獨立NULL列表偏移量首比特標記同Compact
溢出處理部分保留前綴同Compact全部存溢出頁
空間效率較低
適用場景常規OLTP舊系統兼容大字段頻繁更新

格式適用場景不適用場景
Compact通用場景,短記錄為主,兼容舊版本大字段頻繁訪問,存儲成本敏感
Dynamic超長變長字段(TEXT/BLOB),溢出數據占比高記錄普遍短小,需避免溢出頁I/O開銷
Compressed讀多寫少,存儲成本敏感(如歸檔數據)高頻寫入、CPU資源緊張、OLTP系統

六、總結

  1. 行格式選擇:默認使用Dynamic(MySQL 5.7+),平衡空間與性能。

  2. CHAR vs VARCHAR

    1. CHAR適合定長數據(如MD5),減少碎片。

    2. VARCHAR節省空間,但頻繁更新可能產生碎片。

  3. 避免行溢出:大字段(如TEXT/BLOB)建議分離存儲或使用壓縮。

  4. NULL優化:盡量使用NOT NULL,減少NULL列表開銷。

通過理解InnoDB記錄結構,可針對性優化表設計,提升存儲效率與查詢性能。

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

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

相關文章

Deepin(Linux)安裝MySQL指南

1.下載 地址:https://downloads.mysql.com/archives/community/ 2.將文件解壓到 /usr/local 目錄下 先cd到安裝文件所在目錄再解壓,本機是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.創建軟鏈…

ZT9 游游的字母翻倍

描述 游游拿到了一個長度為n的字符串,她每次操作會選擇一個區間[l,r],將第l個字母到第r個字母各重復一次,插入到該字母的后面。 例如,對于字符串"abcd",若選擇區間[2,3]進行操作,字符串將變成&qu…

Visual Studio更新說明(關注:.NET+AI生產力)

Ver V0.0:Visual Studio 2022 v17.12更新:.NET9AI生產力 AI插件推薦 (1)騰訊云AI代碼手(內含了DeepSeek-R1),目前免費,但收費我也可能會買。 AI插件!推薦 (1)百度的…

C++ 設計模式-訪問者模式

C++訪問者模式 一、模式痛點:當if-else成為維護噩夢 開發動物園管理系統,最初的需求很簡單: class Animal {}; class Cat : public Animal {}; class Dog : public Animal {};// 處理動物叫聲 void makeSound(Animal* a) {if (auto c = dynamic_cast<Cat*>(a)) {st…

QEMU源碼全解析 —— 內存虛擬化(17)

接前一篇文章:QEMU源碼全解析 —— 內存虛擬化(16) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 QEMU內存管理模型

java基于數組實現隊列(四)

概述 實現我上一篇博客中提到的 實際上&#xff0c;就是用synchronized代碼塊解決線程安全問題&#xff0c;以及利用wait()、notify()實現線程阻塞、喚醒。 實現 pollV3() private Object lockBySynchronizednew Object();public int pollV3() {synchronized (lockBySynchr…

linux -對文件描述符的操作dup、fcntl有五種

dup #include<unistd.h> int dup(int oldfd);作用&#xff1a;復制一個新的文件描述符fd 3, int fd1 dup(fd);f指向的是a.txt,fd1指向的也是a.txt從空閑的文件描述符表中找一個最小的作為新的拷貝的文件描述符返回&#xff1a;成功返回新的文件描述符&#xff0c;失敗…

DeepSeek各模型現有版本對比分析

文章目錄 一、基礎模型系列&#xff1a;V1 到 V3 的演進二、專用模型系列&#xff1a;推理與多模態三、版本選型與商業化趨勢 DeepSeek作為最近特別火爆的模型&#xff0c;本文將對DeepSeek現有的主要版本進行對比分析,涵蓋參數規模、訓練數據、功能改進、應用場景和性能表現等…

深入解析:在Spring Boot中集成MyBatis Plus實現高效數據庫操作

前后端微服務商城項目&#xff0c;手把手教學&#xff01; 在Spring Boot中集成第三方框架&#xff0c;實際上是非常常見的一種做法。Spring Boot自帶了很多開箱即用的功能&#xff0c;但在實際項目開發中&#xff0c;我們經常需要借助一些第三方框架來實現更為復雜的功能。比如…

現場可以通過手機或者pad實時拍照上傳到大屏幕的照片墻現場大屏電子照片墻功能

現場可以通過手機或者pad實時拍照上傳到大屏幕的照片墻現場大屏電子照片墻功能&#xff0c;每個人都可以通過手機實時拍照上傳到大屏幕上,同時還可以發布留言內容&#xff0c;屏幕上會同步滾動播放展示所有人的照片和留言。相比校傳統的照片直播功能更加靈活方便&#xff0c;而…

項目管理工具Jira在營銷工作管理中的應用與實踐

本文由Atlassian全球白金合作伙伴-龍智編輯整理。 市場營銷人員是維系組織團結的粘合劑。作為公司中最具協作精神的團隊之一&#xff0c;他們確保每個人目標一致&#xff0c;并專注于客戶真正的需求。他們擅長溝通協作&#xff0c;積極響應客戶訴求及塑造品牌方向&#xff0c;…

grafana 忘記登陸密碼

重置 Grafana 登錄密碼 通過命令行重置 admin 密碼 # 如果是通過二進制安裝的 Grafana grafana-cli admin reset-admin-password <新密碼>

基于Flask框架的食譜數據可視化分析系統的設計與實現

【Flask】基于Flask框架的食譜數據可視化分析系統的設計與實現 &#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 在當今數字化時代&#xff0c;信息可視化已成為一種高效的數據理解和傳播手段。…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_array_init 函數

ngx_array_init 定義在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…

基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室

開源項目 botgroup.chat 介紹 AI 多人聊天室&#xff1a; 一個基于 React 和 Cloudflare Pages(免費一鍵部署) 的多人 AI 聊天應用&#xff0c;支持多個 AI 角色同時參與對話&#xff0c;提供類似群聊的交互體驗。體驗地址&#xff1a;https://botgroup.chat 開源倉庫&#x…

GPU和FPGA的區別

GPU&#xff08;Graphics Processing Unit&#xff0c;圖形處理器&#xff09;和 FPGA&#xff08;Field-Programmable Gate Array&#xff0c;現場可編程門陣列&#xff09;不是同一種硬件。 我的理解是&#xff0c;雖然都可以用于并行計算&#xff0c;但是GPU是純計算的硬件…

詳解單例模式、模板方法及項目和源碼應用

大家好&#xff0c;我是此林。 設計模式為解決特定問題提供了標準化的方法。在項目中合理應用設計模式&#xff0c;可以避免重復解決相同類型的問題&#xff0c;使我們能夠更加專注于具體的業務邏輯&#xff0c;減少重復勞動。設計模式在定義系統結構時通常考慮到未來的擴展。…

高清下載油管視頻到本地

下載工具并安裝: yt-dlp官網地址&#xff1a; GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官網地址&#xff1a; Download FFmpeg 注&#xff1a;記住為其添加環境變量 操作命令&#xff1a; 該指令表示以720p碼率下載VIDEO_UR…

Docker掛載數據顯式掛載和隱式掛載的區別

項目使用的Docker file 創建數據卷掛載點&#xff0c;結果發現宿主機目錄中的數據卷路徑下是空的&#xff0c;才知道docker file中創建的數據卷是隱式掛載&#xff0c;并不會在宿主機上留下持久化數據&#xff0c;隨著容器被刪除隱式掛載的數據卷也會跟著被刪除 后面改為在jen…

IOS UITextField 無法隱藏鍵盤問題

設置UITextField 鍵盤按鈕返回鍵為“完成”&#xff0c;即return key 設置done .m代碼設置代理 //設置代理協議 UITextFieldDelegate&#xff0c; self.mobileTextField.delegate self; ///點擊完成鍵隱藏鍵盤 - (BOOL)textFieldShouldReturn:(UITextField *)textField{//取…