日訪 20 萬+ PV,MySQL 成瓶頸,預設參數完全不夠用。以下為 2GB 記憶體主機實測配置(供參考,需依硬體調整)。
| 參數 | 預設值 | 調優值 | 作用與調整依據 |
|---|---|---|---|
| back_log | 50 | 500 | TCP 連接請求隊列長度。出現大量 "unauthenticated user" 待連進程時需調大。受 OS somaxconn 限制。 |
| interactive_timeout | 28800 (8h) | 7200 (2h) | 互動連線空閒斷開時間。縮短釋放閒置連線資源。 |
| key_buffer_size | 8MB | 400MB | MyISAM 索引塊緩衝區。共享所有執行緒。設為實體記憶體 25-30%,過大導致 swap。 |
| max_connections | 100 | 1024 | 最大同時連線數。避免 "Too many connections"。增加會消耗檔案描述符。 |
| record_buffer (read_buffer_size) | 128KB | 16MB | 順序掃描緩衝區/執行緒。大量全表掃描查詢時調大。 |
| sort_buffer_size | 2MB | 16MB | 排序緩衝區/執行緒。加速 ORDER BY、GROUP BY。複雜排序查詢多時調大。 |
| table_cache (table_open_cache) | 64 | 512 | 所有執行緒打開表快取數。每表需 2 檔案描述符。避免頻繁開關表。 |
| thread_cache_size | 0 | 80 | 可複用執行緒快取。高併發短連線場景顯著降低建立執行緒開銷。觀察 Threads_created vs Connections。 |
| wait_timeout | 28800 (8h) | 7200 (2h) | 非互動連線空閒斷開時間。防止睡眠連線佔用資源。 |
| innodb_buffer_pool_size | 159MB | 視記憶體而定 | InnoDB 核心緩衝池(數據+索引)。專用機建議 70-80% 實體記憶體。 |
# 修改 /etc/my.cnf [mysqld] 區段
# 重啟 MySQL
service mysqld restart
SHOW GLOBAL STATUS LIKE 'Threads_created' / Connections → 低比例表 thread_cache 有效SHOW GLOBAL STATUS LIKE 'Key_read_requests' / Key_reads → 命中率 > 99% 表 key_buffer 充足SHOW ENGINE INNODB STATUS 觀察 buffer pool 使用率SHOW PROCESSLIST 觀察 Sleep 連線數量