萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

InnoDB vs MyISAM 六大核心差異:存儲結構、事務、鎖粒度、自增、行數統計與遷移陷阱

六大差異總覽表

維度MyISAMInnoDB選型建議
磁盤存儲結構 三文件:.frm (結構)、.MYD (資料)、.MYI (索引) 共享表空間 ibdata1 + 獨立 .ibd (開啟 file_per_table),大小受 OS 限制 (通常 2TB+) InnoDB 便於單表備份/遷移/壓縮
事務支援 ❌ 不支援 ✅ 完整 ACID、行級鎖、MVCC、崩潰安全恢復 **核心業務必選 InnoDB**
鎖粒度 表鎖 (Table Lock) 行鎖 (Row Lock) + 間隙鎖 + Next-Key Lock 高並發寫入選 InnoDB;唯讀/低並發 MyISAM 可接受
SELECT/INSERT/UPDATE/DELETE 效能 大量 SELECT 快 (全表掃描無 MVCC 開銷) 大量 INSERT/UPDATE 快 (行鎖 + 變更緩衝區) 讀多寫少 → MyISAM;寫多/混合 → InnoDB
AUTO_INCREMENT 行為 表級計數器,重啟後 MAX(id)+1,刪除尾部 ID 不重用 內存計數器,重啟重掃 MAX(id),5.7+ 持久化到 redo log,刪除尾部 ID 重啟後可能重用 InnoDB 8.0+ 持久化解決重啟重掃效能問題
COUNT(*) 效能 O(1) 直接讀取表統計行數 O(N) 全表/索引掃描 (MVCC 可見性檢查) 頻繁 COUNT(*) 考慮快取計數表或 Redis
DELETE 表行為 DELETE FROM t 瞬間完成 (截斷文件) 逐行刪除,產生 Undo Log,較慢但可回滾 大量清空用 TRUNCATE (兩者同為 DDL 瞬時完成)
外鍵支援 ❌ ✅ 需外鍵約束必選 InnoDB
全文索引 ✅ 早期支援 ✅ 5.6+ 支援 (ngram/MeCab 中文分詞) 現代版本無差異
壓縮表 ✅ myisampack (唯讀) ✅ ROW_FORMAT=COMPRESSED (可讀寫) InnoDB 壓縮更靈活

遷移陷阱:MyISAM → InnoDB

  1. ALTER TABLE t ENGINE=InnoDB; 會鎖表重建,大表需 pt-online-schema-change 或 gh-ost 在線轉換
  2. LOAD TABLE FROM MASTER 不支援 InnoDB,改用 mysqldump --master-data=2 + 從庫建立
  3. 應用層若依賴 COUNT(*) 瞬時返回,需重構為快取/計數表
  4. 自增 ID 重啟行為改變,業務若依賴「ID 永不重用」需調整邏輯

混合部署最佳實務

  • 核心交易表 (訂單、帳戶、庫存) → **InnoDB**
  • 日誌/審計/統計/報表表 → **MyISAM** (或 InnoDB 壓縮)
  • 臨時中繼運算表 → **MEMORY/HEAP**
  • 全文搜尋表 → **InnoDB 5.7+** (內建 ngram) 或 **Elasticsearch** 專用引擎
copyright © 萬盛學電腦網 all rights reserved