| 維度 | InnoDB | MyISAM |
|---|---|---|
| 事務支援 | ✅ 完整 ACID、行鎖、MVCC | ❌ 無事務、表鎖 |
| 外鍵 | ✅ 支援 | ❌ 不支援 |
| 崩潰恢復 | ✅ Redo/Undo Log 自動恢復 | ❌ 易損壞,需 REPAIR TABLE |
| 並發效能 | 高寫入並發優勢(行鎖) | 高讀取速度優勢(表鎖、無事務開銷) |
| 儲存空間 | 較大(叢集索引、事務元資料) | 較小(壓縮支援佳) |
| 預設引擎 | MySQL 5.5+ 預設 | 5.5 前預設 |
myisampack)auto_increment 處理(不重用已刪除 ID)FULLTEXT 索引(MySQL 5.6+ InnoDB 也支援)。COUNT(*) 效能SELECT COUNT(*) FROM table 瞬間返回。WHERE 條件時兩者皆需掃描。SHOW TABLE STATUS 的 Rows。AUTO_INCREMENT 索引要求DELETE FROM table 行為TRUNCATE TABLE 兩者皆重建表、重置自增值、速度極快。LOAD TABLE FROM MASTER 限制mysqldump --master-data=2 / XtraBackup / GTID 複寫。當 SQL 無法使用索引鎖定具體行時,InnoDB 退化為表鎖:
-- 範例:LIKE 前置萬用字元導致全表掃描
UPDATE table SET num=1 WHERE name LIKE '%haha%';
對策:避免前置 %、建立全文索引、應用層過濾。
| 業務特徵 | 推薦引擎 | 理由 |
|---|---|---|
| 高併發寫入、需事務、資料完整性關鍵 | InnoDB | 行鎖、ACID、崩潰安全 |
| 純讀取/極少寫入、全文搜尋、統計分析 | MyISAM | 表鎖無瓶頸、COUNT(*)極快、壓縮表 |
| 臨時表、中間結果、快取、可容忍重啟丟失 | Memory | 記憶體速度、Hash 索引 O(1) |
| 巨量寫入、高可用多主、電信計費 | NDB Cluster | Shared-Nothing、同步複寫 |
| 既有 MyISAM 應用、無事務需求、維護成本敏感 | MyISAM → Maria 引擎 | Maria 提供崩潰安全、讀寫不阻塞 |
單一資料庫實例可按表混合引擎:
跨引擎 Join/事務注意:事務不支援跨 MyISAM 表(隱式提交),Join 效能可能受限。
default_storage_engine=InnoDB(避免建表遺漏指定引擎)SELECT COUNT(*) 無條件掃描大表Innodb_row_lock_waits、Table_locks_waited 檢測鎖爭用OPTIMIZE TABLE MyISAM 表整理碎片InnoDB 是現代 MySQL 應用的預設最佳選擇,MyISAM 退守特定唯讀場景。理解兩者在鎖機制、事務、崩潰恢復、統計資訊維護上的根本差異,並根據業務讀寫比、資料完整性要求、並發模式精準選型,才能發揮 MySQL 最大效能。MySQL 8.0 已大幅強化 InnoDB 全文索引、即時 DDL、資源管控,MyISAM 邊緣化趨勢不可逆轉。