選擇儲存引擎是 MySQL 架構設計的首要決策。MyISAM (非事務、表鎖、全文索引) 與 InnoDB (事務、行鎖、MVCC、崩潰安全) 代表兩種截然不同的設計哲學。本文基於實測數據,從插入效能、查詢特性、事務支援、鎖機制、崩潰恢復五大維度深度對比,並給出生產環境選型決策樹。
-- 硬體: Windows, 單機
-- MySQL 5.0/5.1 預設配置
-- innodb_buffer_pool_size=159M, innodb_flush_log_at_trx_commit=1
CREATE TABLE myisam_tbl (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
content TEXT
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
CREATE TABLE innodb_tbl (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
content TEXT
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
-- 測試資料: name='heiyeluren', content=長文本 (~1KB)
| 場景 | 配置 | MyISAM 1萬 | InnoDB 1萬 | MyISAM 10萬 | InnoDB 10萬 | MyISAM 100萬 | InnoDB 100萬 |
|---|---|---|---|---|---|---|---|
| 預設 (flush=1) | autocommit=1 | 3 | 219 | 29 | 2092 | 287 | 未測 (極慢) |
| flush=0 (非持久) | innodb_flush_log_at_trx_commit=0 | 3 | 3 | 30 | 29 | 273 | 423 |
| 大緩衝池 | innodb_buffer_pool_size=1024M | - | 3 | - | 33 | - | 607 |
| 批次提交 | autocommit=0 + 批次 COMMIT | - | 3 | - | 26 | - | 379 |
| 維度 | MyISAM | InnoDB | 選型啟示 |
|---|---|---|---|
| 事務支援 | ❌ 無 (自動提交) | ✅ ACID 完整支援 | 業務需一致性 → InnoDB |
| 鎖粒度 | 表鎖 (TABLE LOCK) | 行鎖 (ROW LOCK) + MVCC | 高併發寫入 → InnoDB |
| 崩潰恢復 | ❌ 需 REPAIR TABLE,可能資料損壞 | ✅ Redo/Undo Log 自動恢復 | 生產環境核心業務 → InnoDB |
| 全文索引 | ✅ 原生支援 (5.6 前) | ✅ 5.6+ 原生支援 | 全文搜尋 5.6+ 皆可 |
| 外鍵約束 | ❌ 無 | ✅ 完整支援 | 引用完整性 → InnoDB |
| 空間/地理 | ❌ 無 | ✅ 5.7+ GIS 原生 | 地理應用 → InnoDB |
| 壓縮表 | ✅ myisampack (唯讀) | ✅ ROW_FORMAT=COMPRESSED | 歸檔唯讀表 → 皆可 |
| 備份方式 | 檔案級熱備份極快 | 邏輯/物理熱備份 (XtraBackup) | 大庫備份窗口考量 |
| 計數器統計 | ✅ COUNT(*) 極快 (元資料) | ❌ COUNT(*) 全表掃描 | 高頻計數 → MyISAM/快取/計數表 |
MySQL 5.5+ 起 InnoDB 為預設引擎,5.6+ 完善全文索引,5.7+ 原生 GIS,8.0+ 瞬間 DDL、資源組、直方圖統計。除非極特殊場景,生產環境統一使用 InnoDB,以:
innodb_buffer_pool_size = 專用機 70-80% 內存innodb_flush_log_at_trx_commit = 1 (核心業務) / 2 (可容忍 1 秒丟失)innodb_file_per_table = ONROW_FORMAT=DYNAMIC (支援長字段溢出頁、壓縮)
-- 1. 評估表大小、索引、外鍵依賴
-- 2. 低峰期執行 (會重建表,鎖表時間 = 表大小/寫入速度)
ALTER TABLE myisam_tbl ENGINE=InnoDB;
-- 3. 或 mysqldump 導出導入 (可控制並發、驗證)
mysqldump --single-transaction db myisam_tbl | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' | mysql db
-- 4. 驗證:資料行數、索引定義、應用功能測試
-- 5. 監控:InnoDB 緩衝池命中率、鎖等待、磁碟 I/O
儲存引擎選擇是架構級決策。InnoDB 以事務、行鎖、MVCC、崩潰恢復四大核心優勢,已成為現代 MySQL 生產環境的**事實標準**。理解兩者差異,不為選擇 MyISAM,而是為了知道在極少數邊緣場景如何妥善處理遷移與共存。