MyISAM 三種儲存格式中,靜態格式為預設(無 VARCHAR/BLOB/TEXT 時)。本文解析固定長度列帶來的速度優勢、快取友善、崩潰恢復簡單、但佔較多空間的特性。
VARCHAR、BLOB、TEXT)CHAR、INT、DATE 等)| 特性 | 說明 |
|---|---|
| 極快查詢 | 第 N 列位移 = (N-1) × 列長,O(1) 直接定位,掃表也能精確計算每次讀取列數 |
| 快取友善 | 固定大小易於記憶體對齊、預讀 |
| 崩潰恢復簡單 | myisamchk 易判斷列邊界,除寫入中斷的列外幾乎全恢復 |
| 重組需求低 | 除非大量刪除需釋放空間,否則無需 OPTIMIZE TABLE |
| 空間較大 | CHAR 會空格填充至定長,通常比動態格式佔更多磁碟 |
CREATE TABLE t (c CHAR(10));
INSERT INTO t VALUES ('ab'); -- 實際儲存 'ab ' (10 bytes)
SELECT c, LENGTH(c), CHAR_LENGTH(c) FROM t;
-- 結果:'ab ', 10, 2
⚠️ 比較時尾端空格**會被忽略**('ab' = 'ab ' 為真),但 LIKE 不忽略。
ALTER TABLE t ROW_FORMAT=DYNAMIC(加入 VARCHAR/TEXT 也會自動轉換)ALTER TABLE t ROW_FORMAT=FIXED(需無變長欄位)myisampack → ROW_FORMAT=COMPRESSED| 格式 | 觸發條件 | 速度 | 空間 | 恢復 | 典型用途 |
|---|---|---|---|---|---|
| 靜態 | 無變長欄位 | 最快 | 最大 | 最簡單 | 查碼表、固定結構日誌 |
| 動態 | 有 VARCHAR/BLOB/TEXT | 中 | 中 | 需 myisamchk | 一般業務表 |
| 壓縮 | myisampack 產生 | 快(唯讀) | 最小 | 不可寫 | 唯讀歸檔、CDN 靜態資料 |