格式對比總覽
| 格式 | 觸發條件 | 行存儲 | 優點 | 缺點 | 適用場景 |
| 靜態 (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 退居特定只讀/歸檔場景。