什麼是儲存引擎?
儲存引擎(Storage Engine)是 MySQL 底層負責資料儲存、索引建立、鎖管理、交易處理、備份恢復的模組化元件。每個表可獨立指定引擎,單一資料庫可混用多種引擎。
CREATE TABLE t1 (id INT) ENGINE=InnoDB;
CREATE TABLE t2 (id INT) ENGINE=MyISAM;
CREATE TABLE t3 (id INT) ENGINE=MEMORY;
查看可用引擎
SHOW ENGINES\G
-- 關鍵欄位:
-- Engine: 引擎名
-- Support: YES/NO/DEFAULT/DISABLED
-- Comment: 簡述
-- Transactions: 是否支援交易
-- XA: 是否支援 XA 分散式交易
-- Savepoints: 是否支援存檔點
主流引擎深度對比
| 引擎 | 交易 | 鎖粒度 | 索引類型 | 適用場景 | 不適用場景 |
| InnoDB | ✅ ACID | 行鎖 | B+樹、FULLTEXT、SPATIAL | 核心業務表、高併發讀寫、需交易、外鍵 | 唯讀壓縮歸檔、極簡日誌 |
| MyISAM | ❌ | 表鎖 | B+樹、FULLTEXT | 唯讀/極少寫入、全文搜尋(舊版)、壓縮表 | 高併發寫入、需交易、崩潰安全 |
| MEMORY (HEAP) | ❌ | 表鎖 | Hash、B+樹 | 暫存表、查找表、Session 快取、極速讀取 | 持久化資料、大資料量(受 max_heap_table_size 限制) |
| Archive | ❌ | 行鎖 | 無(僅支援自增主鍵) | 海量日誌、審計軌跡、唯寫少讀、高壓縮 | 隨機讀取、更新/刪除、需索引 |
| CSV | ❌ | 表鎖 | 無 | 與外部系統交換 CSV、日誌匯出 | 生產業務查詢 |
| NDB Cluster | ✅ | 行鎖 | B+樹、Hash | 分散式高可用、多主寫入、電信級可用性 | 一般單機應用、複雜 JOIN |
| MyRocks | ✅ | 行鎖 | LSM Tree | 寫入密集、儲存空間敏感、SSD 優化 | 讀取密集點查詢、需完整 SQL 功能 |
InnoDB 核心架構優勢
- 叢集索引:主鍵即資料,主鍵查詢極快(零回表)。
- MVCC:多版本並發控制,讀不阻塞寫、寫不阻塞讀。
- Redo Log + Undo Log:崩潰恢復、交易回滾、持久性保證。
- 自適應雜湊索引:熱點頁自動建立 Hash 索引加速點查。
- Change Buffer:非唯一二級索引寫入緩衝,減少隨機 I/O。
引擎選型決策樹
- 需要交易/外鍵/行鎖/崩潰安全? → InnoDB(預設最佳選擇)。
- 唯讀/極少寫入、需全文搜尋(舊版)、壓縮存儲? → MyISAM。
- 臨時資料、極速查找、可接受重啟遺失? → MEMORY。
- 海量唯寫日誌、高壓縮、極少讀取? → Archive。
- 分散式多主、99.999% 可用性? → NDB Cluster。
- 寫入極大、SSD 儲存、空間敏感? → MyRocks(需編譯/安裝外掛)。
引擎轉換實務
-- 線上轉換(鎖表、耗時、需規劃維護窗口)
ALTER TABLE t ENGINE=InnoDB;
-- 無停機轉換(Percona Toolkit)
pt-online-schema-change --alter "ENGINE=InnoDB" D=db,t=t --execute
-- 建表時指定
CREATE TABLE t (id INT PRIMARY KEY, data TEXT) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
引擎參數調校關鍵
| 引擎 | 關鍵參數 | 建議 |
| InnoDB | innodb_buffer_pool_size | 實體記憶體 60~80% |
| InnoDB | innodb_log_file_size | 1~4GB,減少 checkpoint 壓力 |
| InnoDB | innodb_flush_log_at_trx_commit | 1(最安全),2/0 高效能犧牲耐用性 |
| MyISAM | key_buffer_size | 索引快取,4GB 以下機器 256M~1GB |
| MyISAM | myisam_sort_buffer_size | 建立索引排序緩衝,256M |
| MEMORY | max_heap_table_size | 單表最大記憶體,預設 16MB 需調大 |
查看表當前引擎
SHOW TABLE STATUS FROM db_name WHERE Name = 't'\G
-- Engine: InnoDB