全局共享記憶體由 mysqld 進程與存儲引擎共同管理,生命週期隨實例啟停,不隨連線數增減。合理配置這些區域,能最大化緩存命中、降低磁盤 I/O。本文系統梳理 10 大共享記憶體區。
| 記憶體區 | 控制參數 | 適用引擎/場景 | 核心指標/命中率計算 | 調優建議 |
|---|---|---|---|---|
| 查詢緩存 | query_cache_sizequery_cache_type | 全引擎 唯讀/低寫表 | Qcache_hits / (Qcache_hits + Qcache_inserts) | **5.7 已棄用,8.0 移除**;寫多讀少場景建議關閉 query_cache_type=0 |
| 線程緩存 | thread_cache_size | 全引擎 短連接高頻 | (Connections - Threads_created) / Connections | 設為 Max_used_connections 或 100-200,避免頻繁創建/銷毀線程 |
| 表緩存 | table_open_cache(舊 table_cache) | 全引擎 | Open_tables / Opened_tables | 設為 max_connections × 表平均引用數,典型 2000-10000 |
| 表定義緩存 | table_definition_cache | 全引擎 表數量大 | - | 預設 1400(8.0),表超萬建議 4000-20000 |
| Binlog 緩衝 | binlog_cache_sizemax_binlog_cache_size | 事務提交 大事務 | Binlog_cache_use / Binlog_cache_disk_use | 單事務超大時動態增長至 max_binlog_cache_size,預設 32K/4G 通常足夠 |
| Key Buffer | key_buffer_size | MyISAM 索引 | Key_read_requests / Key_reads | MyISAM 為主時設 25%-50% 物理記憶體;InnoDB 為主僅需 16-32M 給系統表 |
| InnoDB Log Buffer | innodb_log_buffer_size | InnoDB 事務日誌 | - | 大事務/Blob 多建議 16-64M;innodb_flush_log_at_trx_commit=1 時可小些 |
| InnoDB Buffer Pool | innodb_buffer_pool_sizeinnodb_buffer_pool_instances | InnoDB 數據+索引 | (Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests | **核心參數**,專用機建議 60%-75% 物理記憶體;實例多時按權重分配 |
| InnoDB Additional Mem Pool | innodb_additional_mem_pool_size | InnoDB 字典/內部結構 | - | **5.6.3 棄用,5.7 移除**,內存不足自動從 Buffer Pool 借用,無需設定 |
| Backlog 隊列 | back_log | 連接風暴緩衝 | Aborted_connects | 高併發突發連線建議 1000-5000,受 OS somaxconn 限制 |
innodb_buffer_pool_instances(建議 1GB/實例)減少互斥鎖爭用。SELECT COUNT(*) FROM 大表 或用 innodb_buffer_pool_dump_at_shutdown/load_at_startup(5.6+)。HandlerSocket、Materialized View。Threads_created。Threads_created 增長速率,若每秒 > 10 應調大 thread_cache_size。OS/FS Cache : 4-6 GB
InnoDB Buffer Pool : 20 GB (innodb_buffer_pool_size=20G, instances=16)
Key Buffer : 32 MB
Query Cache : 0 (OFF)
Thread Cache : 200
Table Open Cache : 5000
Table Definition : 4000
Binlog Cache : 32 MB (per thread, dynamic)
Log Buffer : 64 MB
Backlog : 2000
其他結構 : ~1 GB
總計 ≈ 26 GB,留 6 GB 給 OS,安全邊際充足
mysqld_exporter 采集上述命中率指標。系統化配置全局共享記憶體,是 MySQL 性能調優的基石與最高 ROI 動作。