MyISAM 是 MySQL 5.5 前的預設引擎,以「高讀取效能、全文索引、壓縮表、GIS 函數」著稱,但**不支援事務、行鎖、外鍵**。本篇深入其底層儲存架構:雙檔案結構、跨平台性、行格式判定、指針大小與容量上限配置實測。
.frm:表定義(結構元數據),所有引擎通用。.MYD (MYData):**資料檔**,順序儲存行資料。.MYI (MYIndex):**索引檔**,B+ 樹結構儲存所有索引(含主鍵)。跨平台性:檔案格式與位元組序無關,**可直接複製 .MYD/.MYI/.frm 到不同 OS/CPU 架構**(如 Linux x64 → Windows x86),FLUSH TABLES 後即可掛載使用,極利於異構遷移與備份。
| 格式 | 觸發條件 | 特徵 | 優/缺點 |
|---|---|---|---|
| 靜態 | 無 VARCHAR/BLOB/TEXT 等變長列 | 固定行長,位移計算極快,易修復 | 空間浪費(CHAR 佔滿定長)、不支援變長列 |
| 動態 | 含任一變長列 | 行頭記錄長度+偏移,支援變長、空間緊湊 | 碎片化需 OPTIMIZE TABLE、修復較複雜 |
MySQL 5.0+ 預設傾向動態行格式(ROW_FORMAT=DYNAMIC),可用 ROW_FORMAT=FIXED 強制靜態。
MAX_ROWS 未指定時)。2^48 行位移)。MAX_ROWS。控制參數:MAX_ROWS(預估最大行數)、AVG_ROW_LENGTH(預估平均行長)。MySQL 据此自動選擇指針大小:MAX_ROWS * AVG_ROW_LENGTH > 4GB → 6 字節;> 256TB → 8 字節。
CREATE TABLE mytable (
a INT NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;
SHOW TABLE STATUS LIKE 'mytable'\G
-- Max_data_length: 98784247807 (~91GB)
-- Create_options: max_rows=1000000000 avg_row_length=32
驗證:MySQL 實際分配接近 91GB 容量上限,指針大小自動升級為 6 字節。
ALTER TABLE mytable MAX_ROWS=2000000000 AVG_ROW_LENGTH=32;
-- 觸發全表複製、索引重建,大表耗時極長、鎖表、需雙倍空間
建議:**規劃階段一次設對**,避免後續 ALTER。
myisampack)、GIS 空間索引、跨平台檔案複製、極快 COUNT(*)(無 WHERE 時直接讀表元數據)。| 場景 | 推薦 |
|---|---|
| 唯讀/讀多寫少、無事務、需全文搜尋/GIS | MyISAM |
| 高併發寫入、需 ACID、行鎖、崩潰安全 | InnoDB |
| 歷史歸檔大表、空間敏感 | MyISAM + myisampack |
| 時間序列日誌、按周期分表彙總 | Merge (MyISAM 變體) |