選擇適合的資料表儲存格式,能有效減少資料碎片、提升 I/O 效率,進而最大化資料庫效能。本文詳細比較 MySQL 早期版本(3.23.x)提供的四種表格式——靜態 MyISAM、動態 MyISAM、壓縮 MyISAM 與記憶體 HEAP 表,並說明各自的適用場景與維護要點。
| 表類型 | 特性 | 適用場景 |
|---|---|---|
| 靜態 MyISAM | 固定長度列、極快、易快取、崩潰易修復 | 無 VARCHAR/BLOB/TEXT 欄位、頻繁全表掃描、唯讀或少更新 |
| 動態 MyISAM | 變長列、支援 VARCHAR/BLOB/TEXT、易產生碎片 | 含變長欄位、頻繁 UPDATE/DELETE、需定期 OPTIMIZE TABLE |
| 壓縮 MyISAM | 唯讀、極小磁碟佔用、單獨壓縮每筆記錄 | 歸檔資料、歷史日誌、唯讀查詢為主 |
| HEAP (MEMORY) | 資料全在記憶體、極快、重啟資料消失 | 暫存查找表、多表聯結中間結果、Session 級快取 |
VARCHAR、BLOB、TEXT 欄位時自動使用。CHAR、NUMERIC、DECIMAL 自動補齊至定義寬度。VARCHAR、BLOB、TEXT 時自動採用。OPTIMIZE TABLE 或 myisamchk -r 整理碎片myisamchk -ei 查看統計資訊myisamchk -ed 檢查鏈結(片段)數量3 + (欄位數+7)/8 + 字元欄位數 + 數值欄位壓縮大小 + 字串長度 + (NULL欄位數+7)/8myisampack 工具產生,唯讀、極度省空間。BLOB/TEXT;可用 myisamchk 解壓還原。將常用查找表複製到 HEAP 表,可大幅加速多表聯結。範例:
-- 建立暫存 HEAP 表,預先聯結 tab2、tab3
CREATE TEMPORARY TABLE tmp_heap TYPE=HEAP
SELECT tab2.a AS a2, tab3.a AS a3
FROM tab2, tab3
WHERE tab2.a = tab3.a AND tab2.c != 0;
-- 主查詢改為聯結暫存表
SELECT tab1.a, tmp_heap.a3 FROM tab1, tmp_heap WHERE tab1.a = tmp_heap.a2;
SELECT tab1.b, tmp_heap.a3 FROM tab1, tmp_heap WHERE tab1.a = tmp_heap.a2 AND ...;
此技巧將原本需重複掃描的大表聯結,轉為記憶體級的單表查找,效能提升數倍。
MyISAM 使用 B-Tree 索引,最壞情況(索引鍵按序插入)索引檔大小約為:
Σ (key_length + 4) × 0.67
字串索引會自動進行空白壓縮(尾部空白、前綴相同),有效縮減索引體積。
OPTIMIZE TABLE。