MyISAM 表滿足任一條件即為動態格式:
VARCHAR、BLOB、TEXT)ROW_FORMAT=DYNAMIC對比:靜態表 (Fixed/Static) — 全定長列 (CHAR、INT 等) 且未指定 DYNAMIC。
'' → 標記為空,不存儲內容0 → 標記為空,不存儲[長度字節] + [實際內容]
-- 例: VARCHAR(50) 存 'abc' → [3] + ['a','b','c']
| 優點 | 缺點 |
|---|---|
| 通常比靜態表佔用更少磁盤空間 | UPDATE 易產生行碎片,性能下降 |
| 每行僅佔用實際需要空間 | 崩潰恢復困難:片段鏈接易丟失 |
| 支援可變長度列 (VARCHAR/BLOB/TEXT) | 需定期 OPTIMIZE TABLE 整理碎片 |
-- 方法一: OPTIMIZE TABLE (鎖表,重建表,整理碎片、重置 AUTO_INCREMENT)
OPTIMIZE TABLE `dynamic_table`;
-- 方法二: myisamchk -r (需停庫,速度更快)
myisamchk -r /path/to/table.MYI
-- 方法三: ALTER TABLE ENGINE=MyISAM (重建表,5.6+ 支援 ONLINE)
ALTER TABLE `dynamic_table` ENGINE=MyISAM;
-- 監控碎片
SELECT TABLE_NAME, Data_free
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='db' AND Data_free > 0;
行長度 = 3 -- 基礎開銷
+ (列數 + 7) / 8 -- 空值位圖 (位圖字節數)
+ 字符列數 -- 每字符列 1 字節長度前綴
+ 數值列打包大小 -- TINYINT=1, SMALLINT=2, MEDIUMINT=3, INT=4, BIGINT=8
+ 字符串實際長度總和 -- 非空字符串內容長度
+ (NULL列數 + 7) / 8 -- NULL位圖
每個片段鏈接額外開銷: 6 字節
每個新鏈接最小 20 字節
CREATE TABLE t (
a VARCHAR(10), -- 字符列
b INT, -- 數值列 4 字節
c CHAR(5), -- 定長字符列 (長度<4 視為靜態? 實際 CHAR 視為固定長度)
d TEXT -- 字符列 (動態)
) ROW_FORMAT=DYNAMIC;
-- 插入: a='hi', b=100, c='abc', d='long text...'
-- 行長度 ≈ 3 + (4+7)/8 + 2 + 4 + (2+9) + (0+7)/8 + 6 (若分片)
-- = 3 + 1 + 2 + 4 + 11 + 1 = 22 字節 (不含分片開銷)
結論:關鍵業務表若極其重視崩潰恢復可靠性,可考慮將可變長列拆分到子表 (靜態主表 + 動態子表),或遷移至 InnoDB (Redo/Undo Log 保證崩潰安全)。
# myisamchk 詳細統計
myisamchk -ei /path/to/table.MYI
# 輸出包含: 記錄數、平均行長、碎片數、鏈接數、空間利用率等
# 查看鏈接數 (碎片指標)
myisamchk -ed /path/to/table.MYI
OPTIMIZE TABLE 或 myisamchk -rinformation_schema.TABLES 定期巡檢| 特性 | 靜態表 (Fixed) | 動態表 (Dynamic) | InnoDB (Compact/Redundant/Dynamic/Compressed) |
|---|---|---|---|
| 行格式 | 固定長度 | 可變長度 + 位圖 + 片段 | 可變長度 + 異常頁面 + 溢出頁 |
| 空間效率 | 低 (定長填充) | 高 (實際長度) | 高 (壓縮、溢出頁) |
| UPDATE 性能 | 極快 (原地修改) | 易碎片、需整理 | 優化 (插入緩衝、Change Buffer) |
| 崩潰恢復 | 最簡單可靠 | 困難 (片段鏈接) | 最強 (Redo/Undo Log) |
| 索引支援 | 全類型 | 全類型 | 全類型 + 空間/全文/生成列 |
| 並發 | 表鎖 | 表鎖 | 行鎖 + MVCC |
動態表是 MyISAM 時代為了節省空間支援可變長列的妥協產物。**碎片化、崩潰脆弱、維護成本高** 是其固有代價。現代架構下,**InnoDB 動態行格式 (ROW_FORMAT=DYNAMIC/COMPRESSED) 以 Redo/Undo Log 解決崩潰安全、Change Buffer 緩解碎片、行鎖+MVCC 實現高並發**,是動態表的最佳繼承者與替代者。