引擎演進脈絡
MySQL 採用插件式儲存引擎架構。早期 ISAM → MyISAM(預設,MySQL 5.5 前) → InnoDB(MySQL 5.5+ 預設,支援事務與外鍵)。理解三者特性,才能依業務正確選型。
1. ISAM(Indexed Sequential Access Method)
- 定位:MySQL 早期內建,唯讀/少寫場景
- 優點:讀取極快、資源佔用低
- 缺點:不支援事務、不支援外鍵、無崩潰恢復(硬碟壞掉資料全無)
- 現狀:已淘汰,僅歷史遺留系統可能遇見
2. MyISAM(My Indexed Sequential Access Method)
核心特性
- ISAM 增強版,MySQL 5.5 前預設引擎
- 表級鎖:讀鎖共享、寫鎖獨佔,並發寫入效能差
- 全文索引:早期唯一支援
FULLTEXT 的引擎(5.6+ InnoDB 也支援)
- 壓縮唯讀表:
myisampack 打包歷史歸檔表,極省空間
- 修復工具:
myisamchk 離線修復索引/資料檔
適用場景
- 讀多寫少:報表、日誌、資料倉庫、CMS 內容表
- 無事務需求、可容忍崩潰後手工修復
- 虛擬主機常限制只能用 MyISAM
維護指令
-- 碎片整理(定期執行)
OPTIMIZE TABLE table_name;
-- 損壞修復
REPAIR TABLE table_name;
3. InnoDB(現代標準引擎)
核心優勢
- 行級鎖:高並發寫入效能遠超 MyISAM
- ACID 事務:Commit/Rollback、Savepoint、隔離等級
- 外鍵約束:資料完整性由資料庫層保證
- 崩潰恢復:Redo Log + Undo Log,自動修復
- 聚簇索引:主鍵即資料順序,主鍵查詢極快
- MVCC:多版本並發控制,讀不阻塞寫
資源代價
- 記憶體佔用大:
innodb_buffer_pool_size 建議設物理記憶體 60~80%
- CPU 開銷略高(鎖管理、日誌寫入、MVCC 版本鏈)
- 表空間檔案較大(系統表空間 + 獨立表空間)
4. HEAP / MEMORY 引擎(補充)
- 資料全在記憶體,速度最快
- 重啟資料全失、不支援 BLOB/TEXT、表級鎖
- 適用:臨時緩存表、查詢中繼結果、Session 儲存
選型決策樹
- 需要事務/外鍵/高並發寫入? → InnoDB(預設首選)
- 純唯讀/讀多寫少/需全文索引/虛擬主機限制? → MyISAM
- 臨時高速緩存、可接受重啟丟失? → MEMORY
混合部署實例
-- 核心業務表
CREATE TABLE orders (...) ENGINE=InnoDB;
-- 日誌/報表表
CREATE TABLE access_log (...) ENGINE=MyISAM;
-- Session 暫存
CREATE TABLE session_cache (...) ENGINE=MEMORY;
結語
MySQL 5.5 後 InnoDB 成為預設並非偶然。除非有明確理由(唯讀、全文索引、虛擬主機限制),新專案一律預設 InnoDB。既享受事務安全,又能透過參數調優(buffer pool、log file size、flush method)榨乾硬體效能。