核心架構對比
| 維度 | MyISAM | InnoDB |
| 事務支援 | ❌ 無 | ✅ ACID 完整支援 |
| 鎖粒度 | 表級鎖 | 行級鎖(高併發優勢) |
| 外鍵約束 | ❌ | ✅ |
| 崩潰恢復 | 需手工修復 | 自動 Redo/Undo Log 恢復 |
| 全文索引 | ✅ (5.6 前唯一) | ✅ (5.6+) |
| 存儲方式 | .frm/.MYD/.MYI 分離檔案 | 共享表空間或獨立表空間 |
| 緩存機制 | Key Buffer (只緩索引) + OS Cache (緩數據) | Buffer Pool (數據+索引統一緩存) |
| 適用場景 | 唯讀/讀多寫少、全文檢索、小表 | 核心業務、高併發、事務、數據一致性要求高 |
MyISAM 專屬優化參數
[mysqld]
# 關鍵:只緩存索引,數據靠 OS Cache
key_buffer_size = 30-40% 可用記憶體 # 僅用 MyISAM 時
# 若混用 InnoDB,建議 16-32MB 留給臨時表索引
監控指標: Key_reads / Key_read_requests < 0.01 表示命中率良好。
InnoDB 核心優化參數(生產級模板)
[mysqld]
# 1. 核心緩存池:數據+索引統一緩存,佔物理記憶體 60-80%
innodb_buffer_pool_size = 4G
# 多實例提升併發 (建議 8 個起)
innodb_buffer_pool_instances = 8
# 2. 寫入優化
innodb_log_file_size = 512M # 大日誌減少 checkpoint 壓力
innodb_log_buffer_size = 64M # 大事務緩存
innodb_flush_log_at_trx_commit = 2 # 1=最安全 2=折中 0=最高效(可能丟1秒)
innodb_flush_method = O_DIRECT # 繞過 OS Cache 避免雙重緩存
# 3. 併發與鎖
innodb_thread_concurrency = 0 # 0=不限制,由 OS 調度
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 4. 表空間
innodb_file_per_table = 1 # 獨立表空間,利於回收空間
innodb_open_files = 4000
# 5. 統計資訊持久化
innodb_stats_persistent = 1
innodb_stats_auto_recalc = 1
通用優化參數(兩引擎通用)
| 參數 | 建議值 | 說明 |
table_open_cache | 4000-10000 | 避免頻繁打開/關閉表 |
thread_cache_size | 100-200 | 減少線程創建銷毀開銷 |
query_cache_type | 0 (OFF) | 高併發下鎖爭用嚴重,建議關閉 |
max_connections | 1000-2000 | 配合 thread_cache |
sort_buffer_size | 2-4M | 會話級,過大反而傷記憶體 |
read_rnd_buffer_size | 4-8M | 排序後隨機讀緩存 |
選型決策樹
- 需要事務/外鍵/行級鎖/崩潰安全 → InnoDB(預設首選)。
- 純唯讀、全文檢索、極簡日誌表、MySQL 5.5 以下舊版本 → 可考慮 MyISAM。
- 現代架構:統一 InnoDB,異構需求用 ClickHouse/ES 等專用引擎替代。