MySQL 5.6 大幅改進了默認值,**只需調優極少數關鍵參數**即可發揮 90%+ 性能。本文聚焦「必改」與「高收益」配置,附帶生產級模板。
| 參數 | 默認值 | 建議值 | 調優邏輯 |
|---|---|---|---|
innodb_buffer_pool_size |
128M | 物理內存 50%-80% | 數據+索引熱點緩存核心。64G 內存機器建議 50G。過大導致 OS OOM 或文件系統緩存擠壓。 |
innodb_log_file_size |
48M | 1G - 4G | 大寫入吞吐場景需增大,減少 Checkpoint 刷盤頻率。5.6+ 崩潰恢復速度大幅優化,無需擔心大日志恢復慢。 |
innodb_flush_method |
fdatasync | O_DIRECT (有 RAID 卡/電池備援) fdatasync (無 RAID 或 SAN) |
避免「雙重緩衝」(OS Page Cache + InnoDB Buffer Pool)。O_DIRECT 繞過 OS Cache 直寫磁盤。 |
innodb_flush_neighbors |
1 | 0 (SSD) 1 (HDD RAID) |
SSD 無順序讀寫優勢,關閉鄰近頁刷盤合併。HDD RAID 邏輯連續不代表物理連續,視 RAID 卡策略決定。 |
innodb_io_capacityinnodb_io_capacity_max |
200 / 2000 | 磁盤實測 IOPS 如 RAID10 10 塊 200 IOPS 盤 → 1000 Max 設為 2-3x |
告知 InnoDB 後台每秒可做多少 IO(刷髒頁、Merge Change Buffer、Purge 等)。 類比:航班空座位順便帶上後續乘客,避免高峰期擁擠。 |
innodb_lru_scan_depth |
1024 | ≈ innodb_io_capacity | 5.6 新參數,控制 LRU 尾部掃描深度。配合 IO Capacity 增大同步調大。 |
# 啟用 Binlog 並確保 Crash-Safe log-bin = mysql-bin sync_binlog = 1 # 每次提交刷盤,最安全 sync_relay_log = 1 relay-log-info-repository = TABLE master-info-repository = TABLE expire_logs_days = 7 # 保留 7 天,配合備份策略 server-id = 123 # 拓撲內全局唯一 # 行級復制 (RBR) - 5.6 強烈推薦 binlog_format = ROW transaction-isolation = READ-COMMITTED innodb_autoinc_lock_mode = 2 # Interleaved 鎖模式,配合 RBR 最大化並發
NOW(), UUID())導致主從不一致。| 參數 | 建議值 | 理由 |
|---|---|---|
timezone | GMT / UTC | 全球化業務統一時區,避免夏令時、跨時區排查噩夢。 |
character-set-servercollation-server | utf8mb4utf8mb4_general_ci | 完整 Unicode 支持(含 Emoji),新應用無理由用 utf8 (實為 utf8mb3)。 |
sql_mode | 嚴格模式組合 | 拒絕非法數據入庫(零日期、除零、分組不全等),讓 Bug 在寫入時暴露而非讀取時炸裂。STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY |
skip_name_resolve | ON | 禁用反向 DNS 解析,消除連接建立時的 DNS 延遲/失敗風險。需配合防火牆限制訪問源。 |
max_connect_errors | 100000 | 配合 skip_name_resolve 實際無效,但設大避免誤觸發。真正防暴力破解靠防火牆/安全組。 |
max_connections | 500-1000 | 視應用連接池大小而定。**連接池化是正解**,而非無限增大此值。活躍連接數應遠小於 CPU 核心數 x (2-10)。 |
[mysqld] # InnoDB 核心 innodb_buffer_pool_size = 50G innodb_log_file_size = 2G innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 innodb_io_capacity_max = 6000 innodb_lru_scan_depth = 2000 innodb_flush_neighbors = 0 # Binlog / 復制 log-bin = mysql-bin sync_binlog = 1 sync_relay_log = 1 relay-log-info-repository = TABLE master-info-repository = TABLE expire_logs_days = 10 binlog_format = ROW transaction-isolation = READ-COMMITTED innodb_autoinc_lock_mode = 2 # 通用 timezone = UTC character-set-server = utf8mb4 collation-server = utf8mb4_general_ci sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY" skip_name_resolve = 1 max_connect_errors = 100000 max_connections = 500 # 唯一標識 server-id = 123
max_connections 靠譜。