MySQL 的性能很大程度上取決於配置文件 my.cnf (Windows 下為 my.ini) 的參數設置。一份合理的配置能讓資源利用率最大化,避免「內存溢出」或「CPU 閒置」的尷尬局面。本文將對經典配置示例中的核心參數進行分類解析,並提供針對不同內存規格的優化建議。
配置文件按區塊分為 [client]、[mysqld]、[mysqldump]、[mysql] 等,其中 [mysqld] 區塊的參數影響服務端核心運行行為,是優化的重點。
| 參數 | 示例值 | 解析 |
|---|---|---|
| max_connections | 30 / 512 / 1000 | 最大連接數。需配合 open_files_limit 設置。過大導致內存耗盡,過小報 "Too many connections"。 |
| thread_cache_size | 8 / 64 | 線程緩存池大小。避免頻繁創建/銷毀線程開銷。建議:1G內存 8,2G 16,4G+ 64+。通過 Threads_created / Connections 比率調整。 |
| thread_concurrency | 8 | 建議值 = 邏輯 CPU 核心數 × 2。現代 MySQL 版本已較少依賴此參數,但保留無害。 |
| wait_timeout / interactive_timeout | 10 / 120 | 空閒連接超時時間。Web 應用建議設置較小 (10-30s) 配合連接池使用,防止睡眠連接佔用槽位。 |
| 參數 | 示例值 | 解析 |
|---|---|---|
| key_buffer_size | 128M / 512M / 1G | MyISAM 索引塊緩存。**僅對 MyISAM 生效**。InnoDB 使用 innodb_buffer_pool_size。4G 內存建議 256M-512M,不可過大導致系統 Swap。 |
| innodb_buffer_pool_size | 2G | InnoDB 最核心參數。缓存數據、索引、鎖、插入緩衝等。專用 DB 服務器建議設置為**物理內存的 60%-80%** (如 32G 內存設 22G)。 |
| innodb_log_file_size | 500M | Redo Log 文件大小。較大值減少 Checkpoint 壓力,提升寫入性能。總大小 = size × innodb_log_files_in_group。修改需謹慎操作(見文章 91377)。 |
| query_cache_size / query_cache_type | 64M / ON | MySQL 8.0 已移除。5.7 及之前版本,高併發寫入場景建議關閉 (0),純讀或讀多寫少可開啟。易成為瓶頸鎖點。 |
| sort_buffer_size / read_buffer_size / join_buffer_size | 2M-8M | 每連接獨享內存! 100 連接 × 8M = 800MB。謹慎設置,建議保守 (1M-4M),複雜排序/Join 時在 Session 級臨時調大。 |
| tmp_table_size / max_heap_table_size | 64M / 256M | 內存臨時表大小上限。取兩者最小值。超過則轉磁盤 (MyISAM/InnoDB)。避免複雜查詢產生大臨時表。 |
innodb_data_file_path = ibdata1:500M:autoextend
innodb_data_home_dir = /var/lib/mysql/ibdata
innodb_log_group_home_dir = /var/lib/mysql/iblogs
innodb_flush_log_at_trx_commit = 1 # 1=最安全(ACID), 2/0=高性能但掉電丟數據風險
innodb_lock_wait_timeout = 120
innodb_thread_concurrency = 16 # 0 表示無限制,現代版本建議 0
innodb_file_per_table = 1 # **強烈建議開啟**,獨立表空間便於管理回收空間
log-bin=/var/log/mysql/mysql-bin。[mysqld]
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
key_buffer_size = 64M
max_connections = 200
thread_cache_size = 16
sort_buffer_size = 2M
read_buffer_size = 2M
join_buffer_size = 2M
tmp_table_size = 64M
max_heap_table_size = 64M
query_cache_size = 0 # 建議關閉
slow_query_log = 1
long_query_time = 1
skip-name-resolve
innodb_file_per_table = 1
[mysqld]
innodb_buffer_pool_size = 10G
innodb_log_file_size = 1G
innodb_log_files_in_group = 3
innodb_flush_log_at_trx_commit = 1
innodb_io_capacity = 2000 # SSD 建議 2000-5000
key_buffer_size = 128M
max_connections = 500
thread_cache_size = 64
table_open_cache = 2000
sort_buffer_size = 4M
read_buffer_size = 4M
join_buffer_size = 4M
tmp_table_size = 256M
max_heap_table_size = 256M
slow_query_log = 1
long_query_time = 0.5
log_queries_not_using_indexes = 1
skip-name-resolve
innodb_file_per_table = 1
mysqld --validate-config (8.0+) 或 mysqld --help --verbose 2>&1 | head -20。systemctl restart mysqld。tail -f /var/log/mysql/error.log。SHOW GLOBAL STATUS 分析 Innodb_buffer_pool_reads, Created_tmp_disk_tables, Threads_created 等關鍵指標微調。sort_buffer_size 設為 64M 導致連接數稍增就 OOM。innodb_log_file_size 直接刪文件重啟導致啟動失敗 (需按流程操作)。Swap usage,MySQL 進程一旦 Swap 性能雪崩。mysqltuner.pl 或 MySQLTuner-perl 輔助分析,但**不可盲目執行其建議**。