| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | ❌ | ✅ (ACID) |
| 行級鎖 | ❌ (表鎖) | ✅ |
| 外鍵 | ❌ | ✅ |
| 全文索引 | ✅ (內建) | ✅ (5.6+) |
| 崩潰恢復 | 慢(需掃描修復) | 快(Redo/Undo Log) |
| COUNT(*) | 極快(儲存行數) | 需掃描/估算 |
| 主鍵查詢 | 快 | 極快(叢集索引) |
| 大量 INSERT | 快 | 較慢 |
| 高併發 UPDATE | 鎖表,極慢 | 行鎖,優秀 |
| 資料/索引儲存 | 分離 (.MYD/.MYI) | 共用表空間 |
| 空間佔用 | 較小(索引壓縮) | 較大(約 1.5-2 倍) |
| 備份/遷移 | 複製檔案即可 | 需邏輯備份或 xtrabackup |
SELECT COUNT(*)、ORDER BY 為主的報表/日誌/統計表。平台承載數百 TB、日均 10 億+ PV,核心業務用 InnoDB,但 70% 表為 MyISAM。原因:
- 讀多寫少場景佔多數,MyISAM 讀效能更優、索引壓縮省記憶體。
- 誤
UPDATE發生時,MyISAM 只需複製 .MYD/.MYI 檔案秒級恢復;InnoDB 需邏輯備份還原,耗時數小時。COUNT(*)、ORDER BY佔 SQL 總量 60%+,MyISAM 極快且不鎖表。- 下游數據部門需定期拉取表檔案,MyISAM 直接給 .frm/.MYD/.MYI 即可;InnoDB 需導出 SQL。
- Merge 引擎支援海量日誌表橫向分表聚合查詢,開發效率極高。
架構層面:分庫分表、讀寫分離、緩存層吸收寫入壓力,彌補 MyISAM 寫入弱勢。
-- MyISAM -> InnoDB
ALTER TABLE tbl ENGINE=InnoDB;
-- InnoDB -> MyISAM(需先移除外鍵)
ALTER TABLE tbl DROP FOREIGN KEY fk_name;
ALTER TABLE tbl ENGINE=MyISAM;
大表轉換極慢且鎖表,生產環境必須用 pt-online-schema-change 或 gh-ost。
| 引擎 | 關鍵參數 | 建議值 |
|---|---|---|
| InnoDB | innodb_buffer_pool_size | 實體記憶體 60-80% |
| InnoDB | innodb_flush_log_at_trx_commit | 1(安全) / 2(效能折中) |
| InnoDB | innodb_file_per_table | ON(獨立表空間) |
| MyISAM | key_buffer_size | 實體記憶體 20-30% |
| MyISAM | myisam_sort_buffer_size | 256M+ |
根據業務特性、資料量、運維能力、恢復目標(RPO/RTO)綜合選型。混合部署是常態:核心交易 InnoDB,海量日誌/統計 MyISAM,全文搜尋另上 Elasticsearch。