表 不包含任何變長列(VARCHAR、BLOB、TEXT)時,MyISAM 自動採用靜態格式。所有行長度固定,按行號 × 行長度直接定位。
| 維度 | 靜態表 | 動態/壓縮表 |
|---|---|---|
| 查找速度 | 極快(O(1) 直接寻址) | 需索引或遍歷 |
| 緩存效率 | 高(固定大小易預讀) | 較低 |
| 崩潰恢復 | 簡單可靠(myisamchk 易重建) | 較複雜 |
| 磁盤空間 | 通常較大(CHAR 填充、無壓縮) | 較小(變長、可壓縮) |
| 重組需求 | 極少(除非大量刪除需 OPTIMIZE TABLE) | 定期需整理碎片 |
CHAR(255) 實際只存 'a' 也佔 255 字節 → 濫用 CHAR 導致空間膨脹VARCHAR,業務若需變長字段須拆表或改用動態格式DELETE 後不會自動回收空間,需手動 OPTIMIZE TABLE 或 myisamchk -r-- 查看表格式
SHOW TABLE STATUS LIKE 'tbl_name'\G
-- Row_format: Fixed = 靜態, Dynamic = 動態, Compressed = 壓縮
-- 強制轉為動態格式(引入一個 VARCHAR 列即可)
ALTER TABLE tbl_name MODIFY col_name VARCHAR(255);
MySQL 5.7+ 默認存儲引擎為 InnoDB,MyISAM 靜態表多見於歷史系統或特定只讀場景。新架構優先考慮 InnoDB + 頁壓縮。