隨著 MySQL 5.5+ 將 InnoDB 設為默認引擎,MyISAM 逐漸退出主流舞台。本文梳理遷移前必須評估的 5 大風險點、4 大收益,並提供工程化遷移建議。
AUTO_INCREMENT (如 Discuz「搶樓」功能);InnoDB 強制自增列必須為主鍵或唯一索引第一列。涉及此類業務需重構 (如改用 Redis 實現計數器)。SELECT COUNT(*) 瞬間返回;InnoDB 需全表掃描 (MVCC 可見性檢查),大表極慢。對策:業務層緩存計數、觸發器維護計數表、或接受近似值 SHOW TABLE STATUS。帶 WHERE 走索引時兩者差異微小。ALTER TABLE ... ENGINE=InnoDB 或 INSERT INTO innodb_tbl SELECT * FROM myisam_tbl。LOAD TABLE FROM MASTER 不支持:InnoDB 不支持此舊式複製語法 (極少使用,可忽略)。REPAIR TABLE 手動修復,耗時 4-5 倍且易損壞索引。| 維度 | MyISAM (堆組織表) | InnoDB (索引組織表) |
|---|---|---|
| 數據文件 | .MYD (數據) + .MYI (索引) 分離 | .ibd 表空間文件 (數據+索引共存) |
| 主鍵索引 | B+樹,葉子存行指針 | 聚集索引,葉子存完整行數據 |
| 輔助索引 | B+樹,葉子存行指針 | B+樹,葉子存主鍵值 (回表查聚集索引) |
| 行計數器 | 元數據維護,O(1) | 無,需掃描 |
| Crash Recovery | 不支持 | Redo/Undo Log 完整支持 |
| 空間佔用 | 基準 | 約 1.5-2 倍 (含 Undo、Redo、碎片) |
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='db' AND ENGINE='MyISAM';ALTER TABLE tbl_name ENGINE=InnoDB;
-- 或大表使用 pt-online-schema-change 零停機遷移
innodb_buffer_pool_size 設為物理內存 60-70%;innodb_flush_log_at_trx_commit=1;innodb_file_per_table=ON。遷移不是目的,釋放 InnoDB 事務與並發優勢才是核心價值。建議新建表默認 InnoDB,存量 MyISAM 表按業務優先級分批遷移。