MySQL 支援多種儲存引擎(SHOW ENGINES),但生產環境核心競爭在 InnoDB 與 MyISAM 之間。本文從架構差異、功能特性、效能場景、遷移陷阱四維度深度對比,助你做出正確選型。
| 維度 | InnoDB(聚簇索引) | MyISAM(非聚簇索引) |
|---|---|---|
| 資料與索引儲存 | 共用表空間(ibdata)或獨立表空間(.ibd),主鍵葉子節點存全行資料 | 分離檔案:.MYD(資料)、.MYI(索引),葉子節點存檔案指標 |
| 鎖粒度 | 行級鎖(預設),支援 MVCC | 表級鎖,讀寫互斥 |
| 事務支援 | ACID 完整支援(Commit/Rollback/Crash Recovery) | 不支援 |
| 外鍵約束 | 支援 | 不支援 |
| 全文索引 | 5.6+ 支援 | 原生支援(較早成熟) |
| 崩潰恢復 | Redo/Undo Log,秒級恢復 | 需掃描修復,大表可能耗時數小時 |
COUNT(*) 效能 | 全表掃描(無 WHERE) | O(1) 直接讀取計數器 |
myisampack):唯讀歸檔場景極致壓縮DATA DIRECTORY/INDEX DIRECTORY)| 場景 | InnoDB | MyISAM | 勝出 |
|---|---|---|---|
| 高並發寫入(UPDATE/INSERT/DELETE) | 行級鎖 + MVCC,極佳 | 表級鎖,嚴重阻塞 | InnoDB |
| 大量單點主鍵查詢 | 聚簇索引直接命中,極快 | 需回表,稍慢 | InnoDB |
全表掃描 COUNT(*) 無條件 | 掃描聚簇索引,慢 | 元資料直接返回,極快 | MyISAM |
大批量 INSERT(批次匯入) | 需維護事務日誌,較慢 | 直接寫入,快 | MyISAM |
| 複雜 JOIN 查詢 | 優化器成熟,統計資訊準 | 統計資訊較簡陋 | InnoDB |
| 唯讀歸檔/日誌/審計表 | 功能過剩 | 壓縮表節省空間 | MyISAM |
ALTER TABLE t ENGINE=InnoDB 會鎖表重建,耗時數小時甚至數天innodb_buffer_pool_size 建議設為實體記憶體 70-80%,MyISAM 僅需 Key Bufferpt-online-schema-change 無鎖線上遷移innodb_buffer_pool_size = 70% RAM
innodb_flush_log_at_trx_commit = 2 # 遷移期間可暫時放寬
innodb_log_file_size = 1-4GB
innodb_file_per_table = ON
同一個 MySQL 實例中,不同表可使用不同引擎:
現代 MySQL(5.7/8.0)預設且強烈推薦 InnoDB。除非極特殊場景(唯讀歸檔、老舊全文搜尋依賴),不建議新專案使用 MyISAM。InnoDB 的事務安全、行級鎖、MVCC、崩潰恢復能力,是生產環境資料完整性與高並發效能的基石。