MySQL 內存佔用 = 全局緩存 + 連接級緩存 × 最大連接數。準確估算防 OOM 是運維基本功。
MySQL_used_mem = key_buffer_size + query_cache_size + tmp_table_size
+ innodb_buffer_pool_size + innodb_additional_mem_pool_size
+ innodb_log_buffer_size
+ max_connections * (
read_buffer_size + read_rnd_buffer_size
+ sort_buffer_size + join_buffer_size
+ binlog_cache_size + thread_stack
)
可用 SQL 變量自動計算(文中提供完整腳本)。
SET GLOBAL,需 SUPER 權限,僅對新連接生效。SET SESSION,無特權,僅影響當前連接。| 參數 | 建議值 | 說明 |
|---|---|---|
| max_connections | 1024 | 防 too many connections,同步調大 open_files_limit |
| key_buffer_size | 400M | MyISAM 索引緩存,勿超物理記憶體 30% |
| sort_buffer_size | 16M | 加速 ORDER BY/GROUP BY |
| read_buffer_size | 16M | 順序掃描緩存 |
| table_cache | 512 | 配合 open_files_limit ≥4096 |
| thread_cache_size | 80 | 減少線程創建開銷 |
| innodb_buffer_pool_size | 1.2G | 專用 DB 佔 60%-80%,注意 32 位系統 2-3.5G 限制 |
| innodb_flush_log_at_trx_commit | 2 | 游戲/非極高安全業務建議 2,兼顧性能與秒級持久化 |
| query_cache_size | 64M | 高頻讀、低寫場景啟用;高寫場景建議關閉 |
[mysqld] skip-name-resolve key_buffer_size = 256M max_allowed_packet = 4M table_open_cache = 1024 thread_cache_size = 120 query_cache_size = 64M tmp_table_size = 256M max_connections = 1024 innodb_buffer_pool_size = 6G innodb_log_file_size = 512M innodb_flush_log_at_trx_commit = 2 open_files_limit = 10240
sql-bench (Perl DBI/DBD::mysql)