首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 全局共享記憶體詳細解析:Query Cache、Buffer Pool、Key Buffer、Thread Cache 等核心區調優

     編輯:MySQL 綜合教學

MySQL 全局共享記憶體詳細解析:Query Cache、Buffer Pool、Key Buffer、Thread Cache 等核心區調優

全局共享記憶體由 mysqld 進程與存儲引擎共同管理,生命週期隨實例啟停,不隨連線數增減。合理配置這些區域,能最大化緩存命中、降低磁盤 I/O。本文系統梳理 10 大共享記憶體區。

十大全局共享記憶體區

記憶體區控制參數適用引擎/場景核心指標/命中率計算調優建議
查詢緩存query_cache_size
query_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_size
max_binlog_cache_size
事務提交
大事務
Binlog_cache_use / Binlog_cache_disk_use單事務超大時動態增長至 max_binlog_cache_size,預設 32K/4G 通常足夠
Key Bufferkey_buffer_sizeMyISAM 索引Key_read_requests / Key_readsMyISAM 為主時設 25%-50% 物理記憶體;InnoDB 為主僅需 16-32M 給系統表
InnoDB Log Bufferinnodb_log_buffer_sizeInnoDB 事務日誌-大事務/Blob 多建議 16-64M;innodb_flush_log_at_trx_commit=1 時可小些
InnoDB Buffer Poolinnodb_buffer_pool_size
innodb_buffer_pool_instances
InnoDB 數據+索引(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests**核心參數**,專用機建議 60%-75% 物理記憶體;實例多時按權重分配
InnoDB Additional Mem Poolinnodb_additional_mem_pool_sizeInnoDB 字典/內部結構-**5.6.3 棄用,5.7 移除**,內存不足自動從 Buffer Pool 借用,無需設定
Backlog 隊列back_log連接風暴緩衝Aborted_connects高併發突發連線建議 1000-5000,受 OS somaxconn 限制

核心三區深度聚焦

1. InnoDB Buffer Pool(最關鍵)

  • 緩存 **數據頁 + 索引頁 + 自適應哈希索引 + 鎖資訊 + 插入緩衝** 等。
  • 多實例 innodb_buffer_pool_instances(建議 1GB/實例)減少互斥鎖爭用。
  • 命中率 < 95% 需擴容或檢查熱點數據是否被淘汰。
  • 預熱:重啟後跑 SELECT COUNT(*) FROM 大表 或用 innodb_buffer_pool_dump_at_shutdown/load_at_startup(5.6+)。

2. Query Cache(已廢棄)

  • 機制:SQL 文本 Hash → 結果集緩存;**任何寫入導致相關表所有 Query Cache 失效**。
  • 高寫入場景命中率極低,反而增加互斥鎖開銷。
  • 替代方案:應用層 Redis/Memcached、HandlerSocket、Materialized View。

3. Thread Cache(短連接救星)

  • PHP/Java 連接池不當導致頻繁短連接時,Thread Cache 能大幅降低 Threads_created。
  • 監控 Threads_created 增長速率,若每秒 > 10 應調大 thread_cache_size。

記憶體預算分配範例(32GB 專用機,InnoDB 為主)

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,安全邊際充足

監控儀表盤建議

  • Grafana + Prometheus mysqld_exporter 采集上述命中率指標。
  • 設置告警:Buffer Pool 命中率 < 95%、Table Cache 命中率 < 90%、Thread Cache 命中率 < 90%。

系統化配置全局共享記憶體,是 MySQL 性能調優的基石與最高 ROI 動作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved