| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | 不支援 | 支援(ACID) |
| 鎖粒度 | 表鎖 | 行鎖(意向鎖+記錄鎖+間隙鎖) |
| 外鍵約束 | 不支援 | 支援 |
| 全文索引 | 支援(5.6+ InnoDB 也支援) | 5.6+ 支援 |
| 叢集索引 | 無(堆表) | 有(主鍵即叢集索引) |
| 行數統計 | 元數據直接返回(極快) | 需掃描(或估算) |
| AUTO_INCREMENT | 可建聯合索引 | 必須單獨索引或聯合索引首列 |
| DELETE 全表 | 重建表(快) | 逐行刪除(慢) |
| 崩潰恢復 | 無,依賴 REPAIR TABLE | Redo/Undo Log 自動恢復 |
| 壓縮表 | 支援 myisampack | 不支援(可用壓縮頁面) |
key_buffer_size:索引塊緩衝區。**僅緩存索引**,資料依賴 OS Cache。建議設為可用記憶體 30-40%(純 MyISAM),或 16-32MB(混合場景)。監控 Key_read_requests vs Key_reads 命中率 > 99%。innodb_buffer_pool_size:**核心參數**,緩存數據+索引+鎖+自適應哈希。純 InnoDB 設 70-80% 物理記憶體。監控 Innodb_buffer_pool_read_requests vs Innodb_buffer_pool_reads。innodb_log_file_size:Redo Log 大小,影響寫入性能與恢復時間。建議 256MB-2GB,總大小 innodb_log_files_in_group * innodb_log_file_size。innodb_log_buffer_size:寫入緩衝,默認 8-16MB 足夠,大事務峰值可調大至 64MB。innodb_flush_log_at_trx_commit:
1(默認):每次提交 fsync,最安全,IOPS 壓力大。2:提交寫 OS Cache,每秒 fsync,**推薦大多數業務**,折衷性能與安全(最多丟 1 秒)。0:不主動 fsync,極快但崩潰丟數據。innodb_file_per_table=ON:獨立表空間,便於回收空間、傳輸單表。innodb_io_capacity/innodb_io_capacity_max:根據 SSD/RAID 實際 IOPS 設定,指導刷頁、合併、清理線程。table_open_cache:表緩存,避免頻繁打開/關閉 .frm/.ibd。建議 2000-10000,視表數與連線數而定。thread_cache_size:線程緩存,減少創建/銷毀開銷。建議 16-100,監控 Threads_created 增長趨勢。query_cache_type=0, query_cache_size=0:MySQL 5.7+ 建議關閉,高併發下鎖爭用嚴重,改用 Redis 等外部緩存。sort_buffer_size、join_buffer_size:會話級內存,**慎用大值**(如 256MB),易導致 OOM,通常默認 256KB-2MB 足夠。JOIN 替代子查詢,用 UNION 替代臨時表。ANALYZE TABLE 更新統計。EXPLAIN 分析執行計劃,關注 type、key、rows、Extra。