總內存公式
Total Memory = Global Buffers + (Per Thread Buffers × max_connections)
全局緩衝區
| 參數 | 用途 | 建議值 |
key_buffer_size | MyISAM 索引塊緩存 | 實例內存 5-10%(若全 InnoDB 可設 16-32M) |
innodb_buffer_pool_size | InnoDB 數據+索引+鎖+自適應哈希等核心緩存 | 專用 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 | 全表掃描 | 128KB | 256KB-1MB,大表頻繁掃描可調大 |
read_rnd_buffer_size | 排序後隨機讀 | 256KB | 1MB-2MB,大排序查詢調大 |
sort_buffer_size | ORDER BY/GROUP BY 排序 | 256KB | 1MB-4MB,**勿超 4MB** 否則 mmap 降級 |
join_buffer_size | 無索引 JOIN(ALL/INDEX JOIN) | 256KB | 256KB-1MB,優先加索引避免用到 |
thread_stack | 線程棧(遞歸、存儲過程) | 256KB | 256KB-512K,通常無需動 |
binlog_cache_size | 事務二進制日志緩存 | 32KB | 大事務多可調 64KB-256KB |
tmp_table_size / max_heap_table_size | 內部臨時表(MEMORY 引擎) | 16MB | 64MB-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 避免排序