核心差異對照
| 特性 | InnoDB | MyISAM |
| 事務支援 | ✅ ACID、行級鎖、MVCC | ❌ 無事務、表級鎖 |
| 外鍵約束 | ✅ 支援 | ❌ 不支援 |
| 崩潰恢復 | ✅ Redo/Undo Log 自動恢復 | ❌ 需手工 REPAIR TABLE |
| 並發寫入 | 高 (行鎖) | 低 (表鎖) |
| 全文索引 | 5.6+ 支援 | ✅ 早期優勢 |
| 壓縮表 | 頁面壓縮、Transparent Page Compression | ✅ myisampack 只讀壓縮 |
| 資料檔可移植性 | 需同版本/參數 | ✅ .MYD/.MYI 跨 OS 直接複製 |
| 預設引擎 | 5.5+ 預設 | 5.5 前預設 |
選型決策樹
- 需要事務/外鍵/高並發寫入 → InnoDB
- 純讀多寫少、需全文索引 (5.6 前)、跨 OS 複製檔案 → MyISAM
- 日誌/歸檔/唯寫少讀、極致壓縮 → ARCHIVE
- 記憶體表、極速查找 → MEMORY
引擎遷移操作
-- 單表
ALTER TABLE tbl_name ENGINE = InnoDB;
-- 全庫批量 (配合 48465 存儲過程)
CALL change_all_engine('db_name', 'InnoDB');
遷移避坑指南
- 外鍵:遷移前
SET FOREIGN_KEY_CHECKS=0,遷移後 =1
- 自增主鍵:MyISAM 允許複合主鍵自增第二列,InnoDB 僅支援單列自增 → 需重設計
- 全文索引:5.6 前 MyISAM 遷移到 InnoDB 需重建
FULLTEXT 索引
- 鎖行為變化:表鎖→行鎖,死鎖機率變化,需壓測驗證
- 備份方式:InnoDB 推薦
xtrabackup 熱備,MyISAM 需鎖表或 mysqlhotcopy
InnoDB 獨有效能參數
[mysqld]
innodb_buffer_pool_size = 4G # 核心快取,設物理記憶體 60-80%
innodb_log_file_size = 1G # 大事務日誌減少 checkpoint
innodb_flush_log_at_trx_commit = 2 # 1=最安全,2=每秒刷盤 (高效能)
innodb_file_per_table = ON # 獨立 .ibd 方便管理
innodb_read_io_threads = 8
innodb_write_io_threads = 8