MySQL 效能調優全棧實戰:系統內核參數與實例配置最佳實踐
一、作業系統層優化(Linux)
1. 關閉 SELinux
vim /etc/selinux/config
# SELINUX=enforcing → SELINUX=disabled
# 重啟生效
2. I/O 調度器(機械硬碟)
echo deadline > /sys/block/sda/queue/scheduler
# SSD 無需修改(noop/none 更佳)
3. 檔案描述符限制
vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
4. 核心網路/記憶體參數
vim /etc/sysctl.conf
net.core.netdev_max_backlog = 3000
net.core.optmem_max = 20480
net.core.rmem_default = 8388608
net.core.rmem_max = 8388608
net.core.wmem_default = 1048576
net.core.wmem_max = 1048576
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem = 32768 4194304 8388608
net.ipv4.tcp_wmem = 8192 4194304 8388608
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 3600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 10240 61000
fs.file-max = 6815744
vm.swappiness = 0
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.ctrl-alt-del = 1
sysctl -p # 生效
二、MySQL 5.6.10 實例配置範本(24GB 專用主機)
[mysqld]
socket = /tmp/mysql.sock
max_connections = 1024
max_connect_errors = 10000
max_allowed_packet = 16M
skip-name-resolve
lower_case_table_names = 1
thread_cache = 128
table_open_cache = 1024
query_cache_type = 1
query_cache_size = 128M
join_buffer_size = 8M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
max_heap_table_size = 128M
tmp_table_size = 128M
tmpdir = /dev/shm
binlog_cache_size = 12M
max_binlog_size = 512M
expire_logs_days = 3
innodb_buffer_pool_size = 16G
innodb_use_sys_malloc = 1
innodb_log_file_size = 128M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_lock_wait_timeout = 50
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 視負載啟用
# slow_query_log = 1
# long_query_time = 1
# log_bin = mysql-bin
# server_id = 1
# innodb_flush_log_at_trx_commit = 1
# sync_binlog = 1
三、MySQL 5.6.10 編譯安裝參數
tar zxvf mysql-5.6.10.tar.gz
cd mysql-5.6.10
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_DEBUG=0 \
-DCURSES_LIBRARY=/usr/lib64/libncurses.so \
-DCURSES_INCLUDE_PATH=/usr/include
make && make install
四、核心參數決策依據
| 參數 | 決策邏輯 |
| innodb_buffer_pool_size | 物理記憶體 60~70%,專用主機可達 70~80% |
| innodb_log_file_size | buffer_pool 25%,平衡 Checkpoint 頻率與恢復時間 |
| innodb_flush_log_at_trx_commit | 2:高併發、可容忍秒級丟失;1:金融核心、零丟失 |
| innodb_flush_method | O_DIRECT:繞過 OS Cache,避免雙重緩存與 Swap |
| query_cache_type/size | 高讀低寫開啟;高寫入關閉(鎖爭用嚴重) |
| join_buffer_size | Session 級按需調大(8~32M),大表無索引 Join 場景 |
| tmp_table_size/max_heap_table_size | 同值設定,控制內部臨時表上限,超過轉磁碟 |
| skip-name-resolve | 內網環境必開,消除 DNS 反解延遲 |
五、持續優化閉環
- 啟用慢查詢日誌(
long_query_time=1),定期 pt-query-digest 分析。
- 監控緩存命中率:
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests < 1%。
- 關注連線指標:
Threads_running、Aborted_connects、Max_used_connections。
- 定期
ANALYZE TABLE 更新統計資訊,避免優化器誤判。
- 大表分區、歸檔、冷熱分離,單表行數建議 < 2000 萬。