MySQL 安裝後提供 5 套官方配置模板,針對不同硬體規模預設參數。本文對比模板差異,系統梳理核心參數分類 (路徑、語言、網絡、內存、日誌、主從、InnoDB、其他),附調優建議與避坑指南。
| 模板文件 | 適用場景 | 核心特徵 |
|---|---|---|
| my-huge.cnf | 高端服務器 (1-2GB RAM),專運行 MySQL | 大緩存、大連接數、InnoDB 佔多數內存 |
| my-innodb-heavy-4G.ini | 純 InnoDB,4GB RAM,大查詢低併發 | 巨大 Buffer Pool、大 Log File、單線程優化 |
| my-large.cnf | 中等產品服務器 (~512MB RAM) | 平衡配置、適合通用 Web 應用 |
| my-medium.cnf | 低端服務器 (<128MB RAM) | 精簡緩存、小連接數、嚴格限制資源 |
| my-small.cnf | 極小設備 (<512MB RAM,含 OS) | 最小化配置、僅核心功能 |
選擇建議: 以最接近硬體的模板為基礎,**逐項調優**,不可直接照搬。
| 參數 | 作用 | 建議 |
|---|---|---|
| basedir | 安裝根目錄 | 通常無需修改 |
| datadir | 數據文件目錄 | 掛載獨立高性能磁碟 (NVMe/SSD RAID10) |
| socket | 本地 Unix 域套接字 | /var/lib/mysql/mysql.sock,客戶端優先走 socket |
| pid-file | 進程 ID 文件 | /var/run/mysqld/mysqld.pid |
| lower_case_table_names | 表名大小寫敏感 | Linux 建議 0,跨平台遷移統一用 1 |
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci # 或 utf8mb4_0900_ai_ci (8.0+)
# 避免使用 latin1、utf8 (僅 3 字節)
| 參數 | 建議值 | 說明 |
|---|---|---|
| port | 3306 | 生產環境建議修改非預設端口 + 防火牆限制 |
| bind-address | 127.0.0.1 或內網 IP | 禁止 0.0.0.0 直連公網 |
| skip-name-resolve | ON | 禁用 DNS 反解,加快連接、避免 DNS 故障卡頓 |
| max_connections | 1000~5000 | 配合 thread_cache_size、應用連接池上限 |
| max_connect_errors | 100000 | 防暴力破解誤封,配合 flush hosts |
| 參數 | 默認 | 調優建議 | 備註 |
|---|---|---|---|
| innodb_buffer_pool_size | 128M | 物理內存 70-80% (專用 DB 服務器) | **最關鍵參數**,承載數據+索引+鎖+自適應哈希 |
| innodb_buffer_pool_instances | 1 (或 8) | 1GB 以上建議 8,減少鎖競爭 | 8.0+ 自動調整 |
| innodb_log_file_size | 48M | 1GB~4GB | 大事務/高寫入需調大,重啟恢復時間變長 |
| innodb_log_files_in_group | 2 | 2~4 | 循環寫入 |
| innodb_flush_log_at_trx_commit | 1 | 1 (最高安全) / 2 (高性能妥協) | 0 丟數據風險極大 |
| innodb_flush_method | fsync | O_DIRECT | 避免雙重緩存,需文件系統支援 (ext4/xfs) |
| key_buffer_size | 8M | MyISAM 索引緩存,無 MyISAM 表可設 16M | InnoDB 不使用 |
| query_cache_type / size | ON / 1M | **生產關閉 (0/0)** | 高併發下鎖競爭嚴重,8.0 已移除 |
| tmp_table_size / max_heap_table_size | 16M | 64M~256M | 取小者生效,防臨時表落盤 |
| sort_buffer_size | 256K | 2M~4M (按連接分配,慎設過大) | 排序、ORDER BY 無索引時使用 |
| read_buffer_size / read_rnd_buffer_size | 128K/256K | 2M~8M | 全表掃描/排序讀取緩存 |
| join_buffer_size | 256K | 2M~8M (無索引 Join 時) | 慎設,按連接分配,內存 = 連接數 × 大小 |
| thread_cache_size | 0~10 | 50~200 | 減少線程創建銷毀開銷 |
| table_open_cache | 2000 | max_connections × 2~4 | MyISAM 關鍵,InnoDB 較少用 |
| table_definition_cache | 1400 | 表總數 + 400 | 存儲 .frm 定義 |
| 參數 | 建議 | 說明 |
|---|---|---|
| log_error | /var/log/mysql/error.log | 錯誤日誌,必須啟用 |
| slow_query_log | ON | 慢查詢日誌,核心調優依據 |
| slow_query_log_file | /var/log/mysql/slow.log | |
| long_query_time | 1 (秒) | 生產建議 0.5~1,捕獲更多潛在慢查詢 |
| log_queries_not_using_indexes | OFF | 謹慎開啟,產生大量噪音 |
| log_bin | ON (binlog.000001) | 主從/備份必須,ROW 格式最安全 |
| binlog_format | ROW | STATEMENT 有主從不一致風險,MIXED 折中 |
| expire_logs_days | 7~30 | 自動清理舊 binlog,防磁盤佔滿 |
| max_binlog_size | 1G | 單文件上限,輪轉觸發 |
| sync_binlog | 1 | 每事務同步,最安全;高寫入可放寬到 100~1000 |
主庫關鍵: server-id、log_bin、binlog_format=ROW、gtid_mode=ON、enforce_gtid_consistency=ON (MySQL 5.6+ GTID 模式)。
從庫關鍵: server-id、relay_log、read_only=ON、master_info_repository=TABLE、relay_log_info_repository=TABLE、slave_parallel_workers (多線程復制)。
innodb_file_per_table = ON # 獨立表空間,便於回收空間、傳輸單表
innodb_open_files = 4000 # 配合 file_per_table,足夠大
innodb_io_capacity = 2000 # SSD 可設 5000-10000,HDD 200-500
innodb_io_capacity_max = 4000 # 突發上限
innodb_lru_scan_depth = 1024 # 配合 io_capacity,刷臟頁效率
innodb_deadlock_detect = ON # 死鎖檢測,極高併發可關閉改用 timeout
innodb_print_all_deadlocks = ON # 錯誤日誌記錄所有死鎖,便於分析
default-storage-engine = InnoDB
default-time-zone = '+08:00' # 或 SYSTEM
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_allowed_packet = 64M # 大字段/批量插入需調大
net_read_timeout = 30
net_write_timeout = 60
# 語法檢查
mysqld --verbose --help | grep -A1 '^default-options'
# 應用配置
systemctl restart mysqld
# 運行時動態修改 (部分需重啟)
SET GLOBAL innodb_buffer_pool_size = 8589934592; -- 8GB, 8.0+ 支援在線擴容
SET GLOBAL max_connections = 2000;
避坑提醒: 任何無法識別的參數會導致 MySQL 拒絕啟動。修改前備份 my.cnf,變更後必須 mysqld --validate-config (8.0+) 或啟動測試。