| 維度 | MyISAM | InnoDB |
|---|---|---|
| 存儲結構 | 三文件:.frm(定義) .MYD(數據) .MYI(索引) | 共享表空間 (ibdata1) 或獨立表空間 (.ibd),大小受限於 OS 文件限制 (通常 2GB) |
| 壓縮與空間 | 支援壓縮表,空間較小 | 需更多內存建立緩衝池,不支援表級壓縮 (頁壓縮除外) |
| 可移植性/備份 | 文件級複製即可遷移,單表備份簡單 | 需 mysqldump/xtrabackup/文件複製+binlog,大數據量備份較重 |
| 事務支援 | ❌ 無,僅表級原子操作 | ✅ 完整 ACID,Commit/Rollback/Crash Recovery |
| AUTO_INCREMENT | 可建立聯合索引,非首列也可自增 | 必須包含單列索引,聯合索引必須為首列 |
| 鎖粒度 | 表級鎖 (Table Lock),讀寫互斥 | 行級鎖 (Row Lock),高並發寫入優勢巨大;非主鍵 WHERE 會退化為表鎖 |
| 全文索引 | ✅ 原生 FULLTEXT | 5.6+ 原生支援,早期需 Sphinx 插件 |
| 主鍵要求 | 允許無主鍵/索引,索引存行地址 | 無顯式 PK 時自動生成 6 字節隱藏主鍵,數據即主索引 (聚簇索引) |
| 行數統計 | 元數據保存總行數,COUNT(*) 秒級返回 | 無統計行數,COUNT(*) 全表掃描;帶 WHERE 則同樣走索引 |
| CRUD 效能傾向 | 大量 SELECT 優 | 大量 INSERT/UPDATE/DELETE 優;DELETE FROM table 不重建表,大量清空用 TRUNCATE |
| 外鍵約束 | ❌ | ✅ |
對策:EXPLAIN 確認 type=ref/eq_ref,強制索引 FORCE INDEX。
InnoDB SELECT COUNT(*) FROM t 全表掃描極慢。
解法:維護計數表、Redis 緩存、或近似值 SHOW TABLE STATUS (Rows 欄位)。
| 業務場景 | 推薦引擎 | 核心理由 |
|---|---|---|
| 電商訂單、金融交易、庫存扣減 | InnoDB | 事務一致性、行級鎖高並發、外鍵完整性 |
| 日誌存檔、報表唯讀、全文搜尋 (舊版本) | MyISAM | 壓縮率高、COUNT(*) 快、全文索引成熟 |
| Session 存儲、臨時數據、非關鍵緩存 | MEMORY / Redis | 純內存極速,重啟可丟失 |
| 數據倉庫、海量聚合分析 | Infobright / ClickHouse | 列式存儲、向量化執行、高壓縮 |
InnoDB 已成為 MySQL 生態的「通用王者」,MyISAM 退守特定唯讀角落。理解鎖機制、索引組織、事務邊界,才能在架構層面做出正確抉擇。新項目無特殊理由,**默認選 InnoDB** 從不會錯。