五大引擎特性對比表
| 特性 | MyISAM | BDB | Memory | InnoDB | Archive |
| 存儲限制 | 無 | 無 | 受限於內存 | 64TB | 無 |
| 事務支持 | ❌ | ✅ | ❌ | ✅ (ACID) | ❌ |
| 鎖粒度 | 表鎖 | 頁鎖 | 表鎖 | 行鎖 | 行鎖 |
| B-Tree 索引 | ✅ | ✅ | ✅ | ✅ | ❌ |
| Hash 索引 | ❌ | ❌ | ✅ (默認) | ✅ | ❌ |
| 全文索引 | ✅ | ❌ | ❌ | 5.6+ ✅ | ❌ |
| 聚簇索引 | ❌ | ❌ | ❌ | ✅ | ❌ |
| 數據緩存 | ❌ (依賴 OS) | ✅ | N/A | ✅ (Buffer Pool) | ❌ |
| 索引緩存 | ✅ (Key Buffer) | ✅ | N/A | ✅ | ❌ |
| 數據壓縮 | ✅ (myisampack) | ❌ | ❌ | ✅ (Barracuda) | ✅ (極高) |
| 空間佔用 | 低 | 低 | 高 (內存) | 高 | 極低 |
| 內存佔用 | 低 | 低 | 中等 | 高 | 低 |
| 批量插入速度 | 高 | 高 | 高 | 低 | 極高 |
| 外鍵支持 | ❌ | ✅ | ❌ | ✅ | ❌ |
兩大主流引擎深度解析
MyISAM:傳統只讀/歸檔之王
- 默認引擎 (5.5 前)
- 三文件:.frm(結構) .MYD(數據) .MYI(索引)
- 數據/索引可分盤存放分流 IO
- 全文索引原生支持
- 無事務、表鎖、崩潰易損壞
InnoDB:事務型業務首選
- 5.5+ 默認引擎
- ACID 事務、行鎖、MVCC
- 聚簇索引:主鍵順序存儲,主鍵查詢極快
- 雙重寫緩衝、Redo/Undo Log 保證持久性
- 在線 DDL、表空間傳輸、Memcached API
- 寫入性能略遜 MyISAM、空間佔用大
選型決策樹
┌─ 需要事務/行鎖/外鍵? ──Yes──→ InnoDB
│
新建表 ─────────┤
│ ┌─ 純只讀/歸檔/全文搜索? ──Yes──→ MyISAM
└─ No ───┤
│ ┌─ 需極速查找/臨時表/查找表? ──Yes──→ Memory
└─ No ───┤
│ ┌─ 海量日志/审计/壓縮存儲? ──Yes──→ Archive
└─ No ───┤
└─ 其他 → InnoDB (默認兜底)
混合部署實戰場景
| 業務模塊 | 推薦引擎 | 理由 |
| 核心交易/用戶/訂單 | InnoDB | 事務一致性、高並發行鎖 |
| 日志/審計/點擊流 | Archive / MyISAM | 極高壓縮、批量插入快 |
| 配置/字典/熱點緩存 | Memory | 內存級延遲、數據可重建 |
| 全文搜索/文章/評論 | MyISAM (5.6-) / InnoDB (5.6+) | 版本相關 |
| 報表/數倉宽表 | MyISAM / InnoDB | 只讀多用 MyISAM,混寫用 InnoDB |
遷移指南:MyISAM → InnoDB
-- 1. 結構轉換
ALTER TABLE tbl ENGINE=InnoDB;
-- 2. 主鍵補充(InnoDB 必須有主鍵,無則隱式 6 字節 row_id)
ALTER TABLE tbl ADD id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY;
-- 3. 索引調整(複合索引順序、覆蓋索引)
-- 4. 參數調優
innodb_buffer_pool_size = 物理內存 70%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
版本演進提示
- MySQL 5.5:InnoDB 成為默認引擎
- MySQL 5.6:InnoDB 支持全文索引
- MySQL 5.7:InnoDB 原生 GIS 空間索引
- MySQL 8.0:移除 MyISAM 系統表,完全 InnoDB 化