萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 高並發優化配置全攻略:硬體選型、my.cnf 核心參數、引擎選擇、實戰經驗

硬體選型:性能基石

維度建議理由
磁碟 I/ORAID 10 (SAS/NVMe SSD)順序/隨機讀寫並重,RAID 5 寫入懲罰大,MySQL 不適合
CPU雙路/多路 Xeon,高主頻MySQL 單查詢單線程,高主頻利於複雜查詢;多核利於並發
記憶體≥ 32GB,建議 64GB+InnoDB Buffer Pool 越大越好,熱數據全內存
網路萬兆內網,主從同機房複寫/備份/集群通訊低延遲

my.cnf 核心參數模板(64GB 記憶體、雙路 16 核、NVMe SSD、InnoDB 為主)

[mysqld]
# 基礎
server-id = 1
port = 3306
socket = /tmp/mysql.sock
datadir = /data/mysql
basedir = /usr/local/mysql
user = mysql
skip-name-resolve
skip-external-locking

# 連線
max_connections = 2000
max_connect_errors = 1000000
back_log = 1024
thread_cache_size = 256
thread_concurrency = 32

# InnoDB 核心(佔用 70% 記憶體 ≈ 44GB)
innodb_buffer_pool_size = 44G
innodb_buffer_pool_instances = 8
innodb_file_per_table = 1
innodb_open_files = 4000
innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
innodb_log_buffer_size = 64M
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 0
innodb_flush_method = O_DIRECT
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

# 緩衝區(每連線,總量 = 值 × max_connections)
sort_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
join_buffer_size = 4M

# 表快取
table_open_cache = 4000
table_definition_cache = 2000

# Binlog
log_bin = mysql-bin
binlog_format = ROW
binlog_cache_size = 32M
max_binlog_size = 1G
expire_logs_days = 7
sync_binlog = 1  # 主庫安全優先

# 慢查詢
slow_query_log = 1
long_query_time = 0.5
slow_query_log_file = /data/mysql/slow.log

# 其它
tmp_table_size = 256M
max_heap_table_size = 256M
key_buffer_size = 64M  # 僅用於 MyISAM 臨時表/系統表
query_cache_size = 0
query_cache_type = 0

wait_timeout = 600
interactive_timeout = 600

引擎選擇:MyISAM vs InnoDB

場景推薦引擎理由
高並發讀寫、事務、外鍵、行鎖InnoDBACID、MVCC、行級鎖、崩潰恢復
純讀/極少寫、全文檢索(5.6前)、壓縮表MyISAM表鎖、無事務、全文索引早期優勢
日誌/統計/非關鍵可丟失數據MyISAM / Archive插入快、空間小

現代架構建議:全 InnoDB。5.6+ InnoDB 支援全文索引、壓縮、線上 DDL,無理由再用 MyISAM。

核心參數調優口訣

  1. Buffer Pool 最大化:專用 DB 設物理記憶體 70~80%。
  2. Redo Log 巨大化:innodb_log_file_size 設 1~4GB,減少 Checkpoint 沖刷衝擊。
  3. Flush 策略折衷:主庫 sync_binlog=1, innodb_flush_log_at_trx_commit=1;從庫可設 0/2 提速。
  4. 並行複寫:5.7+ 開啟 slave_parallel_workers、slave_parallel_type=LOGICAL_CLOCK。
  5. 連線池化:應用層必須用連線池,thread_cache_size 只作服務端緩衝。
  6. 關閉 Query Cache:高並發寫入場景 query_cache_size=0,鎖競爭殺手。

實戰經驗談

「幾百 TB 總量、日均 10 億+ PV 動態頁、單庫峰值 9000 萬查詢/天,整體負載 0.5~1.0。核心策略:分庫分表分散壓力、一主多從讀寫分離、Redis 緩存層吸收 95%+ 讀請求、全 InnoDB、SSD RAID10、Buffer Pool 佔 70% 記憶體、Log File 2GB、參數按上述模板調優。MyISAM 早已淘汰。」

copyright © 萬盛學電腦網 all rights reserved