高流量網站 MySQL 瓶頸多在預設參數。本文基於日均 20 萬+ PV 實戰,解析八大關鍵參數調優邏輯與具體數值,附觀測指標與調整原則。
| 參數 | 預設值 | 實戰值 | 調優邏輯與觀測指標 |
|---|---|---|---|
back_log | 50 | 500 | 連接請求堆疊大小。觀測 show processlist 大量 unauthenticated user 時調大 |
interactive_timeout | 28800 | 7200 | 互動連線空閒斷開秒數。降低釋放閒置連線資源 |
key_buffer_size | 8M | 400M | MyISAM 索引緩衝。機器 2GB RAM 給 400M,避免換頁 |
max_connections | 100 | 1024 | 最大並發連線。配合 open_files_limit 調大,防 Too many connections |
read_buffer_size (record_buffer) | 128K | 16M | 全表掃描序列讀取緩衝。大量範圍查詢時調大 |
sort_buffer_size | 2M | 16M | 排序緩衝(ORDER BY/GROUP BY)。每連線獨享,不可過大 |
table_open_cache (table_cache) | 64 | 512 | 表快取數量。觀測 Opened_tables 快速增長時調大 |
thread_cache_size | 0 | 80 | 線程快取。比較 Connections vs Threads_created,前者大幅大於後者即有效 |
wait_timeout | 28800 | 7200 | 非互動連線空閒斷開。配合應用連線池 idle timeout 設定 |
# 修改 /etc/my.cnf
[mysqld]
back_log = 500
key_buffer_size = 400M
max_connections = 1024
sort_buffer_size = 16M
read_buffer_size = 16M
table_open_cache = 512
thread_cache_size = 80
interactive_timeout = 7200
wait_timeout = 7200
# 重啟生效
systemctl restart mysqld
Threads_connected, Slow_queries, Innodb_buffer_pool_reads, Opened_tables, Threads_createdinnodb_buffer_pool_size(建議 70% RAM)、innodb_log_file_size、innodb_flush_log_at_trx_commit 另行調優參數調優是「觀測→假設→驗證」的科學過程,而非套用模板。以業務指標(QPS、RT、錯誤率)為最終判準。