MySQL 記憶體佔用暴漲根因與精準縮減實戰
預設安裝 MySQL (尤其是 Windows MSI 安裝器) 往往配置激進的緩衝區參數,導致虛擬記憶體 (VIRT/COMMIT) 達 800MB+,實體記憶體壓力大。核心參數調整後降至 200MB 以下。
關鍵參數調整對照 (my.ini / my.cnf)
| 參數 | 預設/原值 | 調整值 | 說明 |
| innodb_buffer_pool_size | 576M | 256M | InnoDB 核心緩衝,**佔用大頭**,視實體記憶體 50~70% 設定,小記憶體機器必降 |
| query_cache_size | 100M | 16M | 查詢快取,高寫入場景建議關閉 (0) 或極小 |
| tmp_table_size | 102M | 64M | 內部臨時表上限,超過轉磁碟 MyISAM/InnoDB |
| key_buffer_size | 256M | 32M | MyISAM 索引緩衝,InnoDB 為主可極小 |
| max_connections | 151 | 100~200 | 每連線消耗 sort_buffer/join_buffer/read_buffer 等線程緩衝 |
| thread_cache_size | 0 | 50~100 | 緩存線程減少建立銷毀開銷 |
2GB 記憶體伺服器三種調優模板
| 參數 | 優質型 (站少、求穩) | 抗壓型 (站多、高併發) | 通用折中 |
| table_cache / table_open_cache | 512~1024 | 1024 | 1024 |
| innodb_additional_mem_pool_size | 2M | 4M | 8M (已棄用 5.6.3+) |
| innodb_flush_log_at_trx_commit | 0 (極致效能) | 1 (資料安全) | 1 |
| innodb_log_buffer_size | 1M | 2M | 4M |
| innodb_thread_concurrency | 8 | 8 | 8 (0=無限制) |
| key_buffer_size | 128M | 256M | 128M |
| tmp_table_size | 128M | 64M | 128M |
| read_buffer_size | 64K~128K | 4M | 4M |
| read_rnd_buffer_size | 256K | 16M | 16M |
| sort_buffer_size | 512K | 32M | 32M |
| max_connections | 1024 | 1024 | 1024 |
| thread_cache_size | -- | 120 | -- |
| query_cache_size | -- | 64M | -- |
十大效能參數核心作用速查
max_connections:最大連線數,防 Too many connections。
record_buffer (read_buffer_size):順序掃描緩衝,大表全掃加大。
key_buffer_size:MyISAM 索引緩衝,共享所有線程。
back_log:TCP 連線請求佇列,突發連線風暴調大。
interactive_timeout / wait_timeout:閒置連線超時,防洩漏建議 7200 (2h)。
sort_buffer_size:排序緩衝,ORDER BY/GROUP BY 加速。
table_cache (table_open_cache):開啟表快取,減少開關表開銷。
thread_cache_size:線程快取,對比 Connections vs Threads_created 調整。
字元集:--default-character-set=gb2312 啟動支援中文不分大小寫搜尋。
innodb_buffer_pool_size:InnoDB 核心,**單一最重要參數**。
調整後驗證
# 重啟服務
systemctl restart mysqld
# 觀察進程記憶體
ps aux | grep mysqld
# VIRT/RES 應顯著下降
# 監控關鍵狀態
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';
SHOW GLOBAL STATUS LIKE 'Threads_%';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
避坑提醒
- **勿盲目照抄網上大數值**,參數需匹配實體記憶體、負載特質、資料規模。
- 修改後**必須重啟**生效 (部分參數動態可調,但緩衝區類需重啟)。
- 調整前**備份 my.cnf**,出現啟動失敗可快速回滾。
- 生產環境**灰度發布**:先在從庫/測試庫驗證穩定性再推主庫。