my.cnf 核心變量調優 —— 運維階段主要抓手本文聚焦前三層,特別是生產級 my.cnf 參數深度解析。
| 優化項 | 參數/環境變量 | 收益 | 備註 |
|---|---|---|---|
| 靜態鏈接 | --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static | +13% | 減少動態鏈接開銷,二進制體積增大 |
| Intel 編譯器優化 | CFLAGS="-O3 -xHost" CXXFLAGS="-O3 -xHost -felide-constructors -fno-exceptions -fno-rtti" | +1-3% | 需 Intel CPU,GCC 同樣可用 -march=native |
| Unix Domain Socket | --with-unix-socket-path=/tmp/mysql.sock | +7.5% | 本地連接繞過 TCP 協議棧,Windows 無此優勢 |
| 汇編優化 | --enable-assembler | 微小 | 特定架構手工優化關鍵熱點 |
# 典型編譯命令範例
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti -fomit-frame-pointer -ffixed-ebp" \
./configure \
--prefix=/usr/local/mysql \
--enable-assembler \
--with-innodb \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static \
--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \
--with-charset=utf8mb4 \
--with-collation=utf8mb4_general_ci \
--with-extra-charsets=all
[mysqld]
port = 3306
server_id = 1
socket = /tmp/mysql.sock
skip_name_resolve = 1 # 禁用 DNS 反解,消除連接建立延遲,**要求授權表 Host 列只用 IP**
skip_external_locking = 1 # 禁用系統鎖,減少錯誤、增強穩定
# 連接層
back_log = 384 # 監聽隊列長度,突發連接緩衝,Linux 最大 512
max_connections = 768 # 最大連接數,防 "Too many connections"
max_connect_errors = 10000000 # 防止主機被誤封鎖
wait_timeout = 10 # 空閒連接超時釋放,釋放資源
interactive_timeout = 7200 # 交互式客戶端超時
# 緩衝區(全局)
key_buffer_size = 32M # MyISAM 索引緩衝,純 InnoDB 可設 16-32M
table_open_cache = 512 # 表緩存,視表總數與併發調整
thread_cache_size = 64 # 線程緩存,目標 Threads_created/Connections < 1%
query_cache_size = 0 # **MySQL 5.7 建議關閉**,8.0 已移除
query_cache_type = 0
# InnoDB 核心(專用實例內存 70-80%)
innodb_buffer_pool_size = 2560M # 2.5GB,數據+索引+自適應哈希+鎖+插入緩衝
innodb_buffer_pool_instances = 2 # 多實例減少鎖競爭,每實例 ≥1GB
innodb_log_file_size = 512M # Redo Log 文件大小,大 = 恢復慢但寫入快
innodb_log_files_in_group = 2
innodb_log_buffer_size = 16M # 寫入峰值緩衝
innodb_flush_log_at_trx_commit = 2 # 1=最安全(每提交fsync), 2=折中(每秒fsync), 0=最快但丟數據風險
innodb_flush_method = O_DIRECT # 繞過 OS 緩存,防止雙重緩存浪費內存
innodb_file_per_table = 1 # 獨立表空間,便於管理、回收空間
innodb_read_io_threads = 8 # 後台讀線程
innodb_write_io_threads = 8 # 後台寫線程
innodb_io_capacity = 2000 # SSD IOPS 能力告知引擎,調整刷頁節奏
# 會話級緩衝區(謹慎!× max_connections)
sort_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
join_buffer_size = 2M
thread_stack = 256K
# 臨時表
tmp_table_size = 128M
max_heap_table_size = 128M
# 複製相關(如為主庫)
log_bin = mysql-bin
binlog_format = ROW # ROW 格式最安全,支援混合複製
expire_logs_days = 7
sync_binlog = 1 # 每提交同步 Binlog,配合 innodb_flush_log_at_trx_commit=1 保證零數據丟失
gtid_mode = ON
enforce_gtid_consistency = ON
# 其他
thread_concurrency = 8 # 邏輯 CPU 數 × 2 (4核HT=8線程)
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
SHOW GLOBAL STATUS;
| 變量 | 含義 | 異常閾值與對策 |
|---|---|---|
| Aborted_clients | 客戶端非正常斷開數 | 增長快 → 檢查網絡、超時設置、應用連接池 |
| Aborted_connects | 連接嘗試失敗數 | 增長快 → 檢查防火牆、認證、max_connections |
| Connections | 總連接嘗試數 | 配合 Threads_created 計算線程緩存命中率 |
| Created_tmp_disk_tables | 磁盤臨時表數 | 佔比 > 20% → ↑ tmp_table_size/max_heap_table_size |
| Created_tmp_tables | 總臨時表數 | — |
| Key_read_requests / Key_reads | MyISAM 索引緩存命中/未命中 | 未命中率 > 0.1% → ↑ key_buffer_size |
| Max_used_connections | 歷史峰值併發連接數 | 接近 max_connections → 擴容或優化連接池 |
| Open_tables / Opened_tables | 當前打開表 / 歷史打開表 | Opened_tables 快速增長 → ↑ table_open_cache |
| Questions | 總查詢數 | QPS 基線 |
| Sort_merge_passes | 排序溢寫磁盤歸併次數 | 增長快 → ↑ sort_buffer_size / 優化 ORDER BY |
| Innodb_buffer_pool_read_requests / Innodb_buffer_pool_reads | InnoDB 緩存池命中/未命中 | 未命中率 > 1% → ↑ innodb_buffer_pool_size |
| Innodb_row_lock_waits / Innodb_row_lock_time_avg | 行鎖等待次數/平均等待時間 | 高 → 檢查熱點行、長事務、索引缺失 |
Opened_tables 過大 → ↑ table_open_cacheKey_reads 過大 → ↑ key_buffer_size (MyISAM)Handler_read_rnd_next 過大 → 全表掃描頻繁,**優化 SQL/索引**Threads_created 過大 → ↑ thread_cache_sizeCreated_tmp_disk_tables 過大 → ↑ tmp_table_size, max_heap_table_sizeSort_merge_passes 過大 → ↑ sort_buffer_sizeInnodb_buffer_pool_reads 過大 → ↑ innodb_buffer_pool_sizeInnodb_log_waits > 0 → ↑ innodb_log_buffer_sizeMySQL 優化是系統工程:**硬件定上限,編譯定基線,參數定曲線,SQL/架構定質變**。生產環境應建立配置基線模板,針對業務讀寫比、數據量、併發模式微調。定期采集 SHOW GLOBAL STATUS 快照,構建性能基線,異常時才有對比依據。**「不監控不調優,不基線不判斷」** 是運維鐵律。