MySQL 5.5 前默認 MyISAM,5.5 起默認 InnoDB。兩者在存儲結構、事務、鎖機制、索引等方面差異巨大,選型需根據業務場景決策。
| 維度 | MyISAM | InnoDB |
|---|---|---|
| 存儲結構 | 三文件:.frm(定義) .MYD(數據) .MYI(索引) | 共享表空間或獨立表空間,受限於 OS 文件大小 |
| 壓縮與空間 | 支持壓縮表,空間較小 | 需更多內存,建立緩存池緩存數據與索引 |
| 可移植/備份 | 文件級複製極簡單,單表備份恢復靈活 | 大數據量下依賴 mysqldump 或物理備份工具 |
| 事務支持 | 不支持,僅表級原子操作 | 完整 ACID 事務,支持 Commit/Rollback/崩潰恢復 |
| AUTO_INCREMENT | 可建聯合索引,非首列也可自增 | 必須包含該列獨立索引,聯合索引必為首列 |
| 鎖粒度 | 僅表鎖,並發寫入性能差 | 行鎖(主鍵條件下),高併發優勢明顯 |
| 全文索引 | 原生支持 FULLTEXT | 5.6+ 原生支持,早期需 Sphinx 插件 |
| 主鍵要求 | 可無主鍵,索引存行地址 | 無主鍵自動生成 6 字節隱式主鍵,數據即主索引 |
| 行數統計 | 元數據存總行數,COUNT(*) 極快 | 無統計,COUNT(*) 需全表掃描 |
| DELETE 性能 | 標記刪除,TRUNCATE 重建極快 | 逐行刪除,大表清空必用 TRUNCATE |
| 外鍵約束 | 不支持 | 原生支持 |
MyISAM 表鎖導致讀寫互斥,寫入排他鎖阻塞所有讀寫。InnoDB 行鎖基於索引:WHERE id=1(主鍵)走行鎖;WHERE name='abc'(無索引/非主鍵索引)退化為表鎖。高併發寫入場景必選 InnoDB。
InnoDB 通過 Redo Log(重做日誌)保證持久性,Undo Log 實現回滾,Doublewrite Buffer 防止頁寫入腐壞。MyISAM 崩潰後需 myisamchk 修復,耗時且可能丟數據。
InnoDB 數據文件即主鍵 B+ 樹(聚簇索引),葉子節點存完整行數據;輔助索引葉子存主鍵值,查詢需「回表」。MyISAM 索引與數據分離,主鍵與輔助索引結構相同,葉子存行指針。
任何引擎都非萬能藥,根據業務特徵選擇合適引擎才能最大化 MySQL 性能優勢。現代應用中 InnoDB 已成絕對主流,MyISAM 逐漸邊緣化。