首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL InnoDB 存儲引擎深度解析:表結構與行格式(一)

     編輯:MySQL 綜合教學

MySQL InnoDB 存儲引擎深度解析:表結構與行格式(一)

本篇系統介紹 InnoDB 表的邏輯存儲架構、索引組織表特性、四大行記錄格式(Redundant、Compact、Dynamic、Compressed)及溢出頁機制。

1. 索引組織表

InnoDB 表**必須有主鍵**,數據按主鍵順序存放(B+樹聚簇索引)。若建表未顯式指定 PK,選擇規則:

  1. 首個非空唯一索引(Unique Not Null)
  2. 若無,內部生成 6 字節隱藏 row_id 作為主鍵

注意:選擇依據是**索引定義順序**,而非列定義順序。

2. 邏輯存儲結構

  • Tablespace(表空間):最高層邏輯容器
  • Segment(段):數據段、索引段、Undo 段等
  • Extent(區):連續 64 頁(1MB)
  • Page(頁/塊):最小磁碟管理單位,預設 16KB

3. 行記錄格式演進

文件格式分兩代:

  • Antelope:Redundant(舊)、Compact(5.0+ 預設)
  • Barracuda:Dynamic、Compressed(1.0.x+,需 innodb_file_format=Barracuda)

A. Compact 行格式(5.0 引入,目標:高密度存儲)

結構:

  1. **變長字段長度列表**(逆序,1 或 2 字節)
  2. **NULL 標誌位**(位圖,1 字節對齊)
  3. **記錄頭信息**(5 字節:刪除標記、最小記錄、記錄類型、下一記錄指針、堆號等)
  4. **實際列數據**(NULL 不佔空間)
  5. **隱藏列**:trx_id(6B)、roll_ptr(7B)、無 PK 時額外 row_id(6B)

特點:CHAR(N) 以 UTF8 存儲時優先去尾部空格,預留更新空間減少碎片。

B. Redundant 行格式(5.0 前)

結構:字段長度偏移列表(逆序)+ 記錄頭(6B) + 列數據。
特點:固定長度 CHAR 不去尾空格、NULL 佔用定長空間、主鍵無則用 6B row_id、輔助索引包含主鍵列以回表。

C. 行溢出數據

BLOB/TEXT/VARCHAR 過長時會發生**行溢出**。Compact/Redundant 在本頁保留前 768 字節前綴,餘數存 Off-page;Dynamic/Compressed 僅存 20 字節指針,全部 Off-page(實際長度 ≤40B 仍內聯)。

D. Dynamic 與 Compressed(Barracuda)

  • **Dynamic**:完全行溢出,本頁只存 20B 指針,適合大字段表。
  • **Compressed**:在 Dynamic 基礎上啟用頁壓縮(zlib),節省空間但增加 CPU,TPS 可能降至 10%。

格式對比速查

特性RedundantCompactDynamic/Compressed
空間節省基準~20%~50% (Compressed)
CPU 開銷低低高 (Compressed)
溢出閾值768B 前綴768B 前綴20B 指針 (全溢出)
CHAR 尾空格保留去除去除
NULL 存儲定長佔用僅標誌位僅標誌位

未完待續…

下篇將深入頁結構、Page Directory、File Trailer 校驗、Named File Formats 兼容機制等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved