存儲引擎是 MySQL 區別於其他資料庫的核心特性,不同引擎針對不同業務場景優化。本文系統梳理主流引擎特性、適用場景及選型決策框架,助你做出最優架構決策。
MySQL 採用插件式存儲引擎架構,服務層與存儲層解耦:
查看支持的引擎:SHOW ENGINES;
| 特性 | 支持情況 | 備註 |
|---|---|---|
| 事務支持 | ✅ 完整 ACID | 行級鎖、MVCC |
| 外鍵約束 | ✅ 唯一支持 | 數據完整性保障 |
| 崩潰恢復 | ✅ 自動恢復 | Redo/Undo Log |
| 行級鎖 | ✅ 高併發友好 | 減少鎖衝突 |
| 全文索引 | ✅ 5.6+ | 需配置 ngram parser |
| 壓縮表 | ✅ Barracuda 格式 | 節省存儲空間 |
適用場景:核心業務、高併發寫入、需要事務、外鍵約束、自動災難恢復
| 特性 | 支持情況 | 備註 |
|---|---|---|
| 事務支持 | ❌ 不支持 | 操作不可回滾 |
| 鎖粒度 | 表級鎖 | 寫鎖阻塞所有讀寫 |
| 全文索引 | ✅ 早期優勢 | 5.6+ InnoDB 追平 |
| 壓縮表 | ✅ myisampack | 唯讀壓縮表 |
| 空間索引 | ✅ GIS 支持 | 地理數據查詢 |
文件結構:.frm(定義) + .MYD(數據) + .MYI(索引)
適用場景:日誌分析、報表查詢、只讀數據、全文搜索(舊版本)
max_heap_table_size 限制適用場景:臨時表、中間結果集、查找表、會話存儲
根據業務特性回答以下問題:
單一實例中不同表可使用不同引擎:
-- 核心交易表
CREATE TABLE orders (...) ENGINE=InnoDB;
-- 操作日誌表
CREATE TABLE operation_logs (...) ENGINE=ARCHIVE;
-- 會話緩存表
CREATE TABLE sessions (...) ENGINE=MEMORY;
-- 報告統計表(定時刷新)
CREATE TABLE daily_stats (...) ENGINE=MyISAM;
-- 線上轉換(會鎖表,大表慎用)
ALTER TABLE table_name ENGINE = InnoDB;
-- 大表零停機轉換(pt-online-schema-change)
pt-online-schema-change --alter "ENGINE=InnoDB" D=db,t=table --execute
存儲引擎選型無絕對優劣,只有業務契合度。現代 MySQL 應用中,InnoDB 憑藉完整的事務支持、行級鎖、外鍵約束、崩潰恢復能力,已成為 90%+ 場景的首選。深入理解各引擎特性邊界,結合具體業務場景靈活組合,才是架構師的核心能力。