硬件基線(本文調優基準)
- CPU:2 × 4 核 Intel Xeon 2.0 GHz(8 邏輯核心,含超線程)
- 內存:4 GB DDR
- 磁盤:SCSI 146 GB
- 業務:論壇,在線 5000~13000,高併發讀寫
核心參數配置與解析
基礎與網絡
[mysqld]
port = 3306
server_id = 1
socket = /tmp/mysql.sock
skip-name-resolve # 禁用 DNS 解析,加速連接,授權需用 IP
back_log = 500 # 監聽隊列長度,防連接風暴
內存分配核心區(總量 ≤ 物理內存 70-80%)
| 參數 | 配置值 | 計算邏輯與說明 |
| key_buffer_size | 384M | MyISAM 索引緩存。InnoDB 主場景可降至 64M。監控 Key_reads/Key_read_requests < 1% |
| innodb_buffer_pool_size | 2G | InnoDB 核心,建議物理內存 50-70%。本機 4G 留 1G 給 OS/其他 |
| innodb_log_buffer_size | 16M | 事務日志緩存,大事務場景調大 |
| sort_buffer_size | 4M | 每連接獨佔!100 連接 = 400M。不可盲目調大 |
| read_buffer_size | 4M | 每連接獨佔,全表掃描時使用 |
| join_buffer_size | 8M | 每連接獨佔,無索引 JOIN 時使用 |
| tmp_table_size | 256M | 內存臨時表上限,超過轉磁盤。配合 max_heap_table_size |
| max_heap_table_size | 256M | 用戶創建 MEMORY 表上限 |
併發與連接控制
max_connections = 1000 # 最大連接數,配合應用連接池
thread_cache_size = 64 # 線程緩存,降低創建銷毀開銷
thread_concurrency = 8 # 邏輯 CPU 核心數 × 2 (8核=16? 實測 8 最優)
wait_timeout = 10 # 空閒連接超時釋放,防泄漏
max_connect_errors = 10000000 # 防暴力破解封禁
查詢緩存(5.7 廢用,8.0 移除)
query_cache_size = 64M
query_cache_type = 1
# 監控:Qcache_lowmem_prunes 大→緩存不足;Qcache_hits 小→命中率低可關閉
InnoDB 核心調優
innodb_flush_log_at_trx_commit = 1 # 雙1模式,最安全
sync_binlog = 1 # Binlog 同步刷盤
innodb_file_per_table = 1 # 獨立表空間,便於管理
innodb_read_io_threads = 8 # 讀 IO 線程
innodb_write_io_threads = 8 # 寫 IO 線程
innodb_io_capacity = 2000 # SSD 可調 5000-10000
innodb_lock_wait_timeout = 50 # 鎖等待超時
慢查詢與審計
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 1 秒閾值
log_queries_not_using_indexes = 1 # 記錄無索引查詢
# log_output = FILE # 5.7+ 支持 TABLE
狀態監控指標對照表
| 指標 | 健康閾值 | 異常調優方向 |
| Key_reads / Key_read_requests | < 1% | 增大 key_buffer_size |
| Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests | < 1% | 增大 innodb_buffer_pool_size |
| Created_tmp_disk_tables / Created_tmp_tables | < 10% | 增大 tmp_table_size / 優化 SQL 避免臨時表 |
| Threads_created / Connections | < 5% | 增大 thread_cache_size |
| Table_locks_waited / Table_locks_immediate | < 1% | 優化索引/遷移 InnoDB/調整 concurrent_insert |
| Handler_read_rnd_next / Com_select | < 1000 | 全表掃描嚴重,加索引/改 SQL |
優化避坑原則
- 一參一調:單次變更一個參數,觀察負載測試對比
- 內存總量紅線:所有 buffer 總和 ≤ 物理內存 80%,預留 OS 緩存空間
- 每連接參數慎重:sort/read/join_buffer × max_connections 可能超內存
- 業務驅動調優:針對慢查詢 TOP 10 優化 SQL/索引,效果遠超參數微調
- 版本差異:5.7 移除 query_cache,8.0 移除 query_cache 及部分舊參數
配置文件分層管理
/etc/my.cnf # 全局實例級
/usr/local/mysql/etc/my.cnf # 實例級(多實例部署)
~/.my.cnf # 用戶級客戶端默認
參數調優是科學實驗:建立基線 → 單變量假設 → 壓測驗證 → 監控確認 → 固化配置。以上參數為 4G 內存高併發論壇實戰驗證值,不同硬件/業務需按公式重新計算。