Windows 上 mysql-nt.exe (mysqld) 記憶體持續增長,甚至觸發 OOM 或系統卡頓。
| 參數 | 建議值 | 預設值 | 說明 |
|---|---|---|---|
table_open_cache | 512~1024 | 2000 (8.0) / 400 (5.7) | 表快取數,過大佔記憶體,依 Opened_tables 調整 |
innodb_buffer_pool_size | 物理記憶體 60~70% | 128M | 最關鍵,InnoDB 資料+索引快取池 |
innodb_log_file_size | 256M~1G | 48M | Redo Log 大小,減少 checkpoint 刷盤 |
innodb_log_buffer_size | 16M~64M | 16M | 大事務受益 |
innodb_flush_log_at_trx_commit | 2 | 1 | 1=最安全,2=折中,0=最快但可能丟 1 秒 |
key_buffer_size | 128M~256M | 8M | MyISAM 索引快取,純 InnoDB 可設小 |
tmp_table_size | 64M~256M | 16M | 記憶體臨時表上限,超過轉 MyISAM 磁碟表 |
max_heap_table_size | 同 tmp_table_size | 16M | 配合 tmp_table_size 使用 |
sort_buffer_size | 2M~4M | 256K | 每執行緒排序緩衝,過大易 OOM |
read_buffer_size | 1M~2M | 128K | 全表掃描緩衝 |
read_rnd_buffer_size | 4M~8M | 256K | 排序後隨機讀緩衝 |
join_buffer_size | 2M~4M | 256K | JOIN 無索引時緩衝 |
thread_cache_size | 50~100 | 自動 | 執行緒復用,減少建立/銷毀 |
max_connections | 500~1000 | 151 | 配合 thread_cache_size,避免過大導致記憶體爆炸 |
innodb_thread_concurrency | 0 (自動) 或 2*CPU核心 | 0 | 0=無限制,現代版本建議 0 |
[mysqld]
# 基礎
basedir=C:/Program Files/MySQL/MySQL Server 8.0
datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
port=3306
# 記憶體核心
innodb_buffer_pool_size=4G
innodb_log_file_size=512M
innodb_log_buffer_size=32M
innodb_flush_log_at_trx_commit=2
key_buffer_size=128M
tmp_table_size=128M
max_heap_table_size=128M
# 連線與執行緒
max_connections=800
thread_cache_size=100
table_open_cache=1024
# 排序與 JOIN
sort_buffer_size=2M
read_buffer_size=1M
read_rnd_buffer_size=4M
join_buffer_size=2M
# 其他
innodb_file_per_table=1
skip-name-resolve=1
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
-- 觀察緩衝區命中率
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
-- Innodb_buffer_pool_read_requests / (read_requests + read_ahead + read) > 99%
-- 觀察臨時表落地比例
SHOW GLOBAL STATUS LIKE 'Created_tmp%';
-- Created_tmp_disk_tables / Created_tmp_tables < 10%
-- 觀察排序溢寫磁碟
SHOW GLOBAL STATUS LIKE 'Sort_merge_passes';
-- 應為 0 或極低
-- 觀察開啟表快取命中
SHOW GLOBAL STATUS LIKE 'Open_table%';
-- Open_tables / Opened_tables 高比例
innodb_buffer_pool_size 不能超過 1.5GB,必須升級 64 位版本。PerfMon 觀察 Process(mysql)\Private Bytes、Working Set。mysql-nt.exe 記憶體暴漲 90% 是 innodb_buffer_pool_size 未設或設太小導致頻繁磁碟 I/O、或 sort/join/read_buffer 過大乘以連線數爆炸。按上表依機器記憶體調整核心參數、重啟驗證指標,即可穩定運行。