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

MySQL MyISAM 三種存儲格式詳解:靜態、動態、壓縮

     編輯:MySQL 綜合教學

格式對比總覽

格式觸發條件行存儲優點缺點適用場景
靜態 (Fixed)無 VARCHAR/BLOB/TEXT,或強制 ROW_FORMAT=FIXED固定長度,CHAR 空間填充最快、最安全、易緩存、崩潰易恢復佔空間大、不支援變長欄位定長欄位表、高頻讀取、臨時表
動態 (Dynamic)含 VARCHAR/BLOB/TEXT,或 ROW_FORMAT=DYNAMIC變長,位圖標記 NULL/空串節省空間、支援變長欄位碎片化、崩潰難恢復、需定期 OPTIMIZE通用業務表、含長文本
壓縮 (Compressed)myisampack 工具生成,唯讀單獨壓縮每行極小空間、單行解壓開銷小**不可寫入**、需解壓重建才能修改歸檔表、只讀歷史數據、CDN 分發

靜態表特徵

  • CHAR(n) 固定佔 n 位元組,不足右填空格
  • 行位置 = 表頭大小 + 行號 × 行長度,**O(1) 定位**
  • 崩潰後只需檢查行長度即可重建,無碎片鏈表
  • 通常比動態表大 20-30%

動態表特徵

  • 每行前有**位圖**:標記哪些列為 NULL/空串 (不含 NULL 列)
  • 非空字串列:長度字節 + 內容
  • 更新導致行變長 → **行分裂、碎片化**、透過指針鏈接
  • 崩潰可能丟失碎片鏈接,myisamchk -r / OPTIMIZE TABLE 修復

壓縮表特徵

# 建立壓縮表 (唯讀)
myisampack -f /var/lib/mysql/db/table.MYI

# 解壓還原可寫入
myisamchk -d /var/lib/mysql/db/table.MYI
  • 每行獨立壓縮,隨機讀取無需解壓整表
  • 支援定長/動態行混合
  • 空間壓縮比通常 40-60%

指定格式建表

-- 強制靜態 (即使有 VARCHAR)
CREATE TABLE t (c CHAR(10)) ENGINE=MyISAM ROW_FORMAT=FIXED;

-- 強制動態
CREATE TABLE t (c VARCHAR(10)) ENGINE=MyISAM ROW_FORMAT=DYNAMIC;

-- 預設:有變長列 → 動態,否則 → 靜態

MyISAM vs InnoDB 選擇建議

需求推薦引擎
事務、外鍵、行鎖、高併發寫入InnoDB
全文索引 (5.6 前)、只讀/多讀少寫、空間敏感MyISAM
壓縮只讀歸檔MyISAM + myisampack

MyISAM 三種格式各有千秋:**靜態最快、動態最省、壓縮最小**。現代應用首選 InnoDB,MyISAM 退居特定只讀/歸檔場景。

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