存儲引擎是 MySQL 核心差異化能力的來源。本文深度剖析 6 大主流引擎的架構特點、適用場景、參數調優與選型決策樹,助你根據業務特徵做最優決策。
| 特性 | MyISAM | InnoDB | MEMORY | MERGE | ARCHIVE |
|---|---|---|---|---|---|
| 事務支持 | ❌ | ✅ ACID | ❌ | ❌ | ❌ |
| 鎖粒度 | 表鎖 | 行鎖 + 間隙鎖 | 表鎖 | 表鎖 | 行鎖 |
| 外鍵 | ❌ | ✅ | ❌ | ❌ | ❌ |
| 全文索引 | ✅ (5.6+) | ✅ (5.6+) | ❌ | ❌ | ❌ |
| 數據壓縮 | ✅ myisampack | ✅ page compression | ❌ | ❌ | ✅ zlib 實時壓縮 |
| 崩潰恢復 | ❌ 需修復 | ✅ Redo Log 自動 | ❌ 數據丟失 | ❌ | ❌ |
| MVCC | ❌ | ✅ | ❌ | ❌ | ❌ |
| 適用場景 | 只讀/日志/全文 | 核心業務/高併發 | 熱點緩存/臨時表 | 日志分表聚合 | 歸檔/審計/寫多讀少 |
ibdata1:系統表空間 (含數據字典、Undo Log、雙寫緩衝)ib_logfile0/1:Redo Log 循環寫入table_name.ibd:獨立表空間 (開啟 innodb_file_per_table=ON 時)[mysqld]
# 緩衝池:物理內存 60-70%,核心性能杠桿
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 8
# Redo Log:大文件減少 checkpoint 刷盤頻率
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
# 刷盤策略:1=每次提交刷盤(最安全),2=提交寫OS緩衝,0=每秒刷盤
innodb_flush_log_at_trx_commit = 1
# 並發控制
innodb_thread_concurrency = 0 # 0=不限制
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 死鎖檢測
innodb_deadlock_detect = ON
主鍵即聚簇索引,葉子節點存完整行。二級索引葉子存主鍵值,查詢需「回表」。
設計原則:主鍵單調遞增 (自增/雪花算法),避免頁分裂與碎片。
tbl.frm:表定義tbl.MYD:數據 (MYData)tbl.MYI:索引 (MYIndex)concurrent_insert=2 尾部追加不阻塞讀)COUNT(*) 無 WHERE 時極快 (元數據直讀),但帶條件需全掃| 索引類型 | 優勢 | 劣勢 | 適用 |
|---|---|---|---|
| HASH | = / IN 查詢 O(1) | 不支持範圍、排序、前綴匹配 | 精確查找:Session、驗證碼 |
| BTREE | 支持 >,<,>=,<=,LIKE 'abc%',ORDER BY | 稍慢於 HASH | 範圍查詢、排序需求 |
max_heap_table_size = 256M -- 限制單表最大內存佔用
tmp_table_size = 256M -- 內存臨時表上限,超過轉 MyISAM 落盤
DROP MERGE TABLE 僅刪定義不刪數據需要事務/外鍵/高併發寫入?
├─ YES → InnoDB (默認首選)
└─ NO
需要全文搜索 (5.6 前)?
├─ YES → MyISAM
└─ NO
數據可丟失/可重建/極高性能讀寫?
├─ YES → MEMORY (熱點緩存/Session)
└─ NO
寫多讀少/歸檔/合規存儲/壓縮優先?
├─ YES → ARCHIVE
└─ NO
多張同結構表需統一查詢?
├─ YES → MERGE (MyISAM 子表)
└─ NO → InnoDB (通用兜底)
SHOW ENGINES; -- 所有引擎支持狀態
SHOW ENGINE INNODB STATUS; -- InnoDB 內部監控
SHOW TABLE STATUS LIKE 'tbl_name'; -- 表引擎、行數、大小、碎片
ALTER TABLE tbl_name ENGINE = InnoDB; -- 轉換引擎 (重建表,鎖表)
SET default_storage_engine = InnoDB; -- 會話級默認引擎
innodb_file_per_table=OFF 導致 ibdata1 無限增長,無法回收空間。innodb_compression_algorithm=zlib) 需權衡 CPU/IO。選對引擎,事半功倍。生產環境 95%+ 表應使用 InnoDB,其餘場景按上述決策樹精準匹配。