| 特性 | MyISAM | InnoDB |
| 事務支援 | ❌ | ✅ ACID |
| 行級鎖 | ❌ (表鎖) | ✅ |
| 外鍵 | ❌ | ✅ |
| 崩潰恢復 | ❌ (需修復) | ✅ (Redo/Undo Log) |
| 全文索引 | ✅ (5.6-) | ✅ (5.6+) |
| 壓縮表 | ✅ | ✅ (5.7+) |
| 適用場景 | 只讀/日志/非關鍵 | 核心業務/高併發/事務 |
結論: 現代應用 默認選 InnoDB,MySQL 5.5+ 已默認。
方案一:配置文件修改默認引擎 (新表生效)
# /etc/my.cnf
[mysqld]
default-storage-engine = InnoDB
# 或
default-storage-engine = MyISAM
# 重啟生效
service mysql restart
僅影響 建表時未指定 ENGINE 的新表,不影響現有表。
方案二:建表時顯式指定 (推薦,明確可控)
-- MyISAM → InnoDB (推薦)
ALTER TABLE t_myisam ENGINE=InnoDB;
-- InnoDB → MyISAM
ALTER TABLE t_innodb ENGINE=MyISAM;
-- 驗證
SHOW TABLE STATUS FROM db_name LIKE 't_%';
-- Engine 列顯示當前引擎
SHOW CREATE TABLE t_myisam; -- 末尾顯示 ENGINE=InnoDB
遷移關鍵注意事項
| 項目 | MyISAM → InnoDB | InnoDB → MyISAM |
| 鎖模式 | 表鎖 → 行鎖 (併發提升) | 行鎖 → 表鎖 (併發下降) |
| 空間變化 | 數據+索引合併存 ibdata/.ibd (通常增大 20-30%) | 分離 .MYD/.MYI (通常縮小) |
| 主鍵要求 | 隱式生成 6 字節 RowID | 無隱式主鍵 |
| 全文索引 | 5.6+ 支援,需重建 | 原生支援 |
| 操作耗時 | 大表需數小時 (重建聚簇索引) | 較快 (僅複製文件) |
| 在線 DDL | 5.6+ 支援 ALGORITHM=INPLACE | 需鎖表複製 |
大表遷移最佳實踐 (pt-online-schema-change)
驗證清單
SHOW TABLE STATUS 確認 Engine 列
SHOW CREATE TABLE 確認 ENGINE 子句
- 檢查主鍵/索引定義完整性
- 業務端壓測驗證併發性能
- 監控
Innodb_row_lock_waits / Table_locks_waited
常見問題
- 外鍵遷移失敗:InnoDB 要求被引用表也為 InnoDB,需同步遷移關聯表
- 全文索引報錯:5.6 前 InnoDB 不支援,升級或轉 MyISAM
- 磁盤空間不足:遷移需臨時雙倍空間,預留 2x 表大小
- 自增 ID 重置:遷移不改變自增值,但 InnoDB 重啟後重新計算 max+1
- 上一篇文章: MySQL 服務啟動與關閉全方式對比:mysqld、mysqld_safe、systemd、mysql.server 腳本詳解
- 下一篇文章: MySQL 壓力測試實戰:mysqlslap 參數詳解、海量測試數據生成存儲過程與性能基準建立
Copyright ©
程式碼之家 All Rights Reserved