| 引擎 | 事務 | 鎖粒度 | MVCC | 外鍵 | 全文索引 | 壓縮 | 典型場景 | 備註 |
|---|---|---|---|---|---|---|---|---|
| InnoDB | ✅ ACID | 行鎖 | ✅ | ✅ | ✅ (5.6+) | ✅ (頁面/表) | 核心業務、高併發讀寫、需事務一致性 | 5.5+ 默認引擎,首選 |
| MyISAM | ❌ | 表鎖 | ❌ | ❌ | ✅ (5.6+) | ✅ (myisampack) | 只讀/讀多寫少、日志歸檔、非關鍵數據 | 不支持崩潰恢復,慎用於核心業務 |
| Memory (HEAP) | ❌ | 表鎖 | ❌ | ❌ | ❌ | N/A (純內存) | 臨時表、查詢緩存、極速查找表 (如郵編表) | 重啟數據丟失,僅作中間結果 |
| Archive | ❌ | 行鎖 (插入) | ❌ | ❌ | ❌ | ✅ (zlib) | 海量歷史日志、審計記錄、寫入極多讀極少 | 壓縮率高 (~1:10),不支持索引 |
| CSV | ❌ | 表鎖 | ❌ | ❌ | ❌ | ❌ | 與外部系統交換數據、日志導出 | 純文本 CSV 文件,不支持 NULL、索引 |
| Blackhole | ✅ | 行鎖 | ✅ | ❌ | ❌ | N/A | 主庫過濾 Binlog、異構同步中繼、壓測丟棄數據 | 寫入即丟棄,Binlog 仍記錄 |
| Federated | ❌ | 遠程表鎖 | ❌ | ❌ | ❌ | ❌ | 跨實例聯合查詢、異構數據虛擬化 | 性能依賴網絡,生產慎用 |
| NDB Cluster | ✅ | 行鎖 | ✅ | ✅ | ❌ | ❌ | 極高可用、跨機房同步、電信級計費 | 架構複雜,運維成本高 |
| Merge (MRG_MyISAM) | ❌ | 表鎖 | ❌ | ❌ | ❌ | ❌ | 歷史分表聯合查詢 (如按月分表日志) | 底層為 MyISAM 表集合,5.7+ 建議用分區表替代 |
| PERFORMANCE_SCHEMA | - | - | - | - | - | - | 實例級性能診斷、等待事件分析 | 非業務數據引擎,不可建表 |
CREATE TABLE audit_log (
id BIGINT UNSIGNED AUTO_INCREMENT,
op_time DATETIME(3) NOT NULL,
user_id BIGINT,
action VARCHAR(64),
detail JSON,
PRIMARY KEY (id)
) ENGINE=Archive COMPRESSION='zlib';
-- 插入極快、壓縮率高、不支持索引、僅支持 INSERT/SELECT
主庫建 Blackhole 表,從庫建 InnoDB 實體表。主庫寫入 Blackhole → Binlog 記錄 → 從庫重放落地。實現「主庫不存數據、從庫全量存儲」的異構架構。
CREATE TABLE ip_region_lookup (
ip_start INT UNSIGNED NOT NULL,
ip_end INT UNSIGNED NOT NULL,
region_id SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (ip_start)
) ENGINE=Memory;
-- 服務啟動時從持久表載入,微秒級查詢,重啟需重載
CREATE TABLE remote_orders (
id BIGINT,
user_id BIGINT,
amount DECIMAL(10,2)
) ENGINE=FEDERATED
CONNECTION='mysql://user:pass@remote-host:3306/db/orders';
-- 適合低頻、小結果集跨實例查詢,大數據量會全表掃描遠程
默認 InnoDB,除非有極其充分理由選擇其他。
理由:事務、行鎖、MVCC、崩潰恢復、外鍵、全文索引、壓縮、自適應哈希索引、變更緩衝 — 一站式解決 99% 核心業務場景。
特殊場景 (日志歸檔、臨時中間表、跨實例虛擬化) 再引入 Archive、Memory、Federated 等專用引擎。
-- 查看實例支持引擎 SHOW ENGINES; -- 查看表引擎 SHOW TABLE STATUS FROM db_name WHERE Name = 'tbl_name'; -- 修改引擎 (會重建表,大表用 pt-online-schema-change) ALTER TABLE tbl_name ENGINE = InnoDB;