將既有 MyISAM 表轉為 InnoDB 可獲得事務支援、行級鎖、崩潰恢復與更高並發效能,但需注意結構與行為差異。本文系統梳理遷移前必檢項目、轉換語法、效能調優與回滾方案。
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 儲存結構 | 堆組織表 (Heap) | 索引組織表 (B+Tree 聚簇索引) |
| 事務 | 不支援 | 支援 (ACID) |
| 鎖粒度 | 表鎖 | 行鎖 |
| 外鍵 | 不支援 | 支援 |
| 全文索引 | 支援 (5.6 前) | 5.6+ 支援 |
| 計數器 | 精確 COUNT(*) 極快 | 無計數器,COUNT(*) 掃描 |
| 崩潰恢復 | 需 REPAIR TABLE,慢 | 自動 Redo/Undo 恢復,快 |
| 資料/索引檔案 | 分離 (.MYD/.MYI) | 共享表空間 (.ibd 或 ibdata1) |
| 主鍵葉節點 | 指向行指標 | 完整行資料 (聚簇索引) |
| 空間佔用 | 基準 | 約 1.5-2 倍 |
PRIMARY KEY (type, id)),InnoDB 強制自增欄必為主鍵第一欄。COUNT(*) 無條件掃描:InnoDB 全表掃描較慢。SELECT COUNT(*) FROM t WHERE indexed_col > 0 走索引。INSERT SELECT 導入 InnoDB 正式表,利用 MyISAM 批次寫入快的特性。LOAD TABLE FROM MASTER:InnoDB 不支援。mysqldump --single-transaction 或 GTID 複製。-- 1. 備份 mysqldump -u root -p --single-transaction --routines --triggers db_name tbl_name > tbl_backup.sql -- 2. 線上轉換 (MySQL 5.6+ 支援 Online DDL,僅短暫元數據鎖) ALTER TABLE tbl_name ENGINE=InnoDB; -- 3. 驗證 SHOW TABLE STATUS LIKE 'tbl_name'\G -- Engine: InnoDB -- 4. 重建索引/統計資訊 (可選) ANALYZE TABLE tbl_name; OPTIMIZE TABLE tbl_name; -- 實際上會重建表
[mysqld] # 核心:緩衝池佔實體記憶體 60-80% innodb_buffer_pool_size = 4G # 日誌檔大小,減少 checkpoint 壓力 innodb_log_file_size = 512M innodb_log_files_in_group = 2 # 刷盤策略:1=每提交刷盤(最安全), 2=每秒刷盤(高效能) innodb_flush_log_at_trx_commit = 2 # 並發控制 innodb_thread_concurrency = 0 # 0=不限制 # 檔案格式 innodb_file_format = Barracuda innodb_file_per_table = 1
-- 若轉換後出現嚴重效能退化,可從備份還原 mysql -u root -p db_name < tbl_backup.sql -- 或直接 ALTER TABLE tbl_name ENGINE=MyISAM; (需鎖表,慎用)
ALTER TABLE ... ENGINE=InnoDBInnodb_row_lock_waits、Innodb_buffer_pool_reads 等狀態innodb_buffer_pool_size 等核心參數並重啟ANALYZE TABLE 更新統計資訊