引擎選擇決策矩陣
| 維度 | MyISAM | InnoDB | NDB Cluster |
| 事務 | ❌ | ✅ 4 隔離級別 + MVCC | ✅ |
| 鎖粒度 | 表鎖 | 行鎖 (走索引) | 行鎖 (分散式) |
| 讀寫阻塞 | 互相阻塞 | 依隔離級別,可非鎖定讀 | 分散式協調 |
| 緩存 | 僅索引 | 索引 + 資料 (Buffer Pool) | 全記憶體 (索引+資料必須在 RAM) |
| 儲存結構 | 堆表 + 索引分離 | 聚集索引 = 資料 (B+樹) | 分散式分片 |
| 硬體需求 | 低 | 大記憶體發揮優勢 | 極大記憶體、高速網路 |
MyISAM:輕量唯讀/日誌場景
適用條件
- 無事務需求
- 低併發、寫入稀少
- 以讀為主 (報表、日誌、快取表)
- 資料一致性要求低 (可重建)
最佳實踐
- 盡量建立索引 (配合 key_buffer 緩存)
- 調整讀寫優先級
LOW_PRIORITY_UPDATES=1
- 大批量寫入用
INSERT DELAYED (5.6+ 棄用) 或 LOAD DATA
- 有序插入減少碎片
- 拆解大操作、限制併發數、應用層排隊
- 靜態資料充分利用 Query Cache
COUNT(*) 無 WHERE 時極快 (儲存行數)
InnoDB:通用 OLTP 首選
適用條件
- 需要事務、行鎖、高併發、頻繁更新、強一致性
- 記憶體充足 (建議 Buffer Pool ≥ 資料熱點集合大小)
最佳實踐
- 主鍵**盡可能小** (INT/BIGINT),避免擴大所有二級索引
- 避免全表掃描 (導致表鎖)
- 盡可能緩存所有索引與熱點資料
- 大批量小寫入:**手動控制事務** (關閉 autocommit 批量提交)
innodb_flush_log_at_trx_commit = 2 平衡性能與安全 (每秒刷盤)
- 避免更新主鍵 (引發大量資料移動)
NDB Cluster:極致併發與擴展
特性
- 分散式架構:多節點分片存儲
- 索引與被索引資料**必須全在記憶體** (新版)
- 可與 mysqld 分離部署
適用場景
- 極高併發、單請求延遲非極度敏感
- 查詢模式固定簡單、單次回傳少量資料
- 不想自行實作 Sharding
最佳實踐
- 查詢極簡化,避免跨節點資料傳輸 (Join/子查詢慎用)
- 預先規劃分片鍵,確保資料均勻分佈
選擇建議總結
- **90%+ 專案首選 InnoDB** — 功能最完整、生態最成熟、效能上限最高
- 唯讀/日誌/報表/全文搜尋 (5.6 前) → MyISAM
- 千萬級併發、簡單 KV 存取、硬體預算充足 → NDB Cluster
引擎選擇是架構級決策,**InnoDB 為預設最佳解**,除非有極強理由否則不要輕易切換。