首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 內存使用全景圖:全局緩衝區 + 線程私有緩衝區參數計算公式與調優指南

     編輯:MySQL 資料庫相關知識

總內存公式

Total Memory = Global Buffers + (Per Thread Buffers × max_connections)

全局緩衝區

參數用途建議值
key_buffer_sizeMyISAM 索引塊緩存實例內存 5-10%(若全 InnoDB 可設 16-32M)
innodb_buffer_pool_sizeInnoDB 數據+索引+鎖+自適應哈希等核心緩存專用 DB 服務器物理內存 60-80%
innodb_additional_mem_pool_size數據字典、內部結構(5.6.3+ 已廢棄,併入 buffer pool)默認 8M,通常無需調整
innodb_log_buffer_size重做日志緩存,大事務時調大16M-64M
query_cache_size查詢緩存(5.7.20+ 棄用)0 或 64-256M

線程私有緩衝區(每連接分配)

參數觸發場景默認值調優建議
read_buffer_size全表掃描128KB256KB-1MB,大表頻繁掃描可調大
read_rnd_buffer_size排序後隨機讀256KB1MB-2MB,大排序查詢調大
sort_buffer_sizeORDER BY/GROUP BY 排序256KB1MB-4MB,**勿超 4MB** 否則 mmap 降級
join_buffer_size無索引 JOIN(ALL/INDEX JOIN)256KB256KB-1MB,優先加索引避免用到
thread_stack線程棧(遞歸、存儲過程)256KB256KB-512K,通常無需動
binlog_cache_size事務二進制日志緩存32KB大事務多可調 64KB-256KB
tmp_table_size / max_heap_table_size內部臨時表(MEMORY 引擎)16MB64MB-256MB,超過則轉 MyISAM 磁盤表

計算示例

-- 假設 max_connections=500
Per Thread = (256K+1M+2M+512K+256K+256K+32K+64M) ≈ 68.8 MB
Thread Total = 68.8 MB × 500 ≈ 34.4 GB  ← 明顯超標!

-- 實際建議:降低 per-thread 參數、限制 max_connections、用連接池
-- 典型配置:max_connections=200,per-thread 總和 ≈ 10MB → 2GB 線程內存
Global ≈ 20GB (buffer_pool) + 1GB (其他) = 21GB
Total ≈ 23GB(在 32GB 服務器上留 9GB 給 OS/FS Cache)

監控指標

  • Threads_created 快增 → thread_cache_size 過小
  • Created_tmp_disk_tables / Created_tmp_tables > 10% → 增大 tmp_table_size
  • Sort_merge_passes > 0 → 增大 sort_buffer_size 或優化 SQL 避免排序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved