MySQL 支援插件式儲存引擎,最常用的三種——MyISAM、InnoDB、Memory——在鎖粒度、事務支援、索引結構、適用場景上差異巨大。本文從底層特性到選型決策樹,幫助你為每張表做最合適的選擇。
| 特性 | MyISAM | InnoDB | Memory |
|---|---|---|---|
| 預設引擎 (≤5.5) | ✅ | ❌ | ❌ |
| 預設引擎 (≥5.6) | ❌ | ✅ | ❌ |
| 索引類型 | B-Tree, FullText, R-Tree | B-Tree, Hash | Hash, B-Tree |
| 鎖粒度 | 表鎖 | 行鎖 | 表鎖 |
| 事務支援 | ❌ | ✅ (ACID) | ❌ |
| 外鍵支援 | ❌ | ✅ | ❌ |
| 崩潰恢復 | ❌ (需修復) | ✅ (Redo/Undo Log) | ❌ (重啟即丟失) |
| 緩存機制 | 只緩索引 | 緩索引+資料 | 全記憶體 |
| 全文索引 | ✅ (原生) | ✅ (5.6+) | ❌ |
| 資料壓縮 | ✅ (myisampack) | ✅ (頁面壓縮) | ❌ |
COUNT(*) 無 WHERE 時因元資料直接返回較快;帶條件查詢 InnoDB 自適應哈希索引往往更快。同一資料庫不同表可用不同引擎:
CREATE TABLE logs (...) ENGINE=MyISAM; -- 唯讀日誌
CREATE TABLE users (...) ENGINE=InnoDB; -- 核心業務
CREATE TABLE session_cache (...) ENGINE=Memory; -- 暫存
選對引擎是架構設計的基石。現代應用預設首選 InnoDB,僅在明確符合上述 MyISAM/Memory 場景時才切換,避免為了「查詢快」犧牲資料安全與並發能力。