MySQL 存儲引擎決定了表的儲存方式、鎖粒度、事務支援、崩潰恢復能力。MyISAM 曾是預設引擎,InnoDB 自 5.5 起成為預設。本文從架構、功能、效能、運維多維度深度對比,給出場景化選型建議。
| 維度 | MyISAM | InnoDB |
|---|---|---|
| 儲存結構 | 三文件:.frm結構、.MYD資料、.MYI索引 | 共享表空間 ibdata1 或獨立表空間 .ibd(innodb_file_per_table=ON) |
| 表大小限制 | 受文件系統限制(通常 2TB+) | 受作業系統文件大小限制(通常 2GB/16TB 視 OS/FS) |
| 可移植性 | 極高:直接複製三文件即可跨平台遷移 | 較低:需 mysqldump 邏輯導出或傳輸整個表空間 |
| 備份恢復 | 單表級備份極簡單(複製文件) | 大表備份慢,依賴 mysqldump/XtraBackup/快照 |
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務 (ACID) | ❌ 不支援 | ✅ 完整支援(Commit/Rollback/Crash Recovery) |
| 外鍵約束 | ❌ 不支援 | ✅ 支援 |
| 全文索引 | ✅ 內建(5.6+) | ✅ 內建(5.6+),或接入 Sphinx/Elasticsearch |
| 鎖粒度 | 表鎖 | 行鎖(主鍵條件下),意向鎖、間隙鎖、Next-Key Lock |
| MVCC | ❌ 無 | ✅ 多版本並發控制,讀不阻塞寫,寫不阻塞讀 |
| 自增主鍵 | 可與其他欄位建聯合索引 | 必須包含單列索引(或為主鍵首列) |
| COUNT(*) 無 WHERE | ✅ 極快(儲存行數) | ❌ 全表掃描(MVCC 可見性檢查) |
| COUNT(*) 有 WHERE | 同 InnoDB | 同 MyISAM |
| 操作 | MyISAM | InnoDB | 說明 |
|---|---|---|---|
| SELECT | 略快 | 略慢 | MyISAM 無 MVCC 開銷,但 InnoDB 緩衝池命中時差距微小 |
| INSERT | 慢(表鎖) | 快(行鎖+變更緩衝) | 高併發寫入 InnoDB 完勝 |
| UPDATE | 慢(表鎖) | 快(行鎖) | 同上 |
| DELETE | 慢(表鎖) | 快(行鎖,標記刪除+Purge) | MyISAM 會重建表,InnoDB 標記刪除 |
| 場景 | 推薦引擎 | 理由 |
|---|---|---|
| 核心業務表(訂單、用戶、賬戶、交易) | InnoDB | 事務一致性、行鎖並發、崩潰安全、外鍵完整性 |
| 高併發讀寫混合 | InnoDB | MVCC+行鎖支撐高吞吐 |
| 唯讀/極少寫的查詢表(報表、日誌歸檔) | MyISAM 或 InnoDB | MyISAM 壓縮只讀表省空間;InnoDB 統一維護更簡單 |
| 全文檢索為主(舊版本) | MyISAM | 5.6 前 InnoDB 不支援全文 |
| 嵌入式/極度資源受限 | MyISAM | 無事務開銷、元數據輕量 |
| 需要表級備份/拷貝遷移 | MyISAM | 文件級複製秒級完成 |
| 臨時表/中間表 | Memory/InnoDB | 視生命週期與資料量 |
除非有極特殊理由(如唯讀歸檔表壓縮、嵌入式設備),**生產環境建議全庫統一 InnoDB**:
innodb_file_per_table=ON、innodb_buffer_pool_size 合理設定、innodb_flush_log_at_trx_commit=1 保證持久性-- 單表
ALTER TABLE t ENGINE=InnoDB;
-- 全庫腳本
SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE = 'MyISAM' AND TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys');
遷移前必備份、測試驗證、觀察鎖爭用與磁碟空間變化。
InnoDB 是現代 MySQL 應用的**首選引擎**,以事務安全、行級並發、崩潰恢復三大核心優勢支撐業務增長。MyISAM 退居特定唯讀/歸檔場景。理解兩者本質差異,才能在架構設計、故障排查、容量規劃中做出正確決策。