本文轉自老男孩教育梁為 Linux 博客,系統總結 MySQL 優化知識體系,涵蓋硬件、安裝、配置、運行期調優、高可用架構,極具落地價值。
--without-debug(去除調試符號)、--with-mysqld-ldflags=--all-static、--with-client-ldflags=--all-static(靜態鏈接)。[client]
port = 3306
socket = /data/3306/mysql.sock
default-character-set = utf8
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
character-set-server = utf8
log-error = /data/3306/mysql_err.log
pid-file = /data/3306/mysql.pid
# 核心優化
skip-name-resolve # 禁用 DNS 解析
skip-locking
max_connections = 800
max_connect_errors = 6000
wait_timeout = 120
table_open_cache = 512
thread_cache_size = 64 # 1G→8, 2G→16, 4G+→64
thread_concurrency = 8 # 邏輯 CPU 數 × 2
query_cache_size = 64M
query_cache_limit = 2M
key_buffer_size = 256M # MyISAM 索引緩存
sort_buffer_size = 1M
join_buffer_size = 8M
read_buffer_size = 4M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 8M
# InnoDB 核心
innodb_buffer_pool_size = 64M # 物理內存 50-80% 視業務而定,切勿盲目佔用
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_flush_log_at_trx_commit = 1 # 0/2 高性能但有丟數據風險
innodb_file_per_table = 0 # 1 為獨立表空間,利於空間回收
# Binlog & 復制
log-bin = /data/3306/mysql-bin
binlog_format = ROW
expire_logs_days = 7
server-id = 1
log_slave_updates = 1
# 慢查詢
long_query_time = 1
slow_query_log = 1
slow_query_log_file = /data/3306/slow.log
關鍵差異:innodb_buffer_pool_size=512M、innodb_flush_log_at_trx_commit=2、max_connections=5000、thread_concurrency=32、tmp_table_size=256M、max_heap_table_size=512M、expire_logs_days=90。
| 指標 | 健康閾值 | 調優動作 |
|---|---|---|
| 慢查詢 | Slow_queries 增長快 | 開啟慢查詢日誌、pt-query-digest 分析 Top SQL |
| 連接數 | Max_used_connections / max_connections > 85% | 擴容或優化應用連接池 |
| Key Buffer | Key_reads / Key_read_requests < 0.1% | 過低增大 key_buffer_size,過高減小 |
| 臨時表 | Created_tmp_disk_tables / Created_tmp_tables < 25% | 增大 tmp_table_size/max_heap_table_size |
| 打開表 | Open_tables / Opened_tables > 85% | 增大 table_open_cache |
| 線程緩存 | Threads_created 持續增長 | 增大 thread_cache_size |
| 查詢緩存 | 命中率 Qcache_hits/(Qcache_hits+Qcache_inserts)、碎片率 Qcache_free_blocks/Qcache_total_blocks | 調整 query_cache_size/query_cache_min_res_unit、定期 FLUSH QUERY CACHE |
| 排序 | Sort_merge_passes 高 | 增大 sort_buffer_size |
| 文件句柄 | Open_files / open_files_limit < 75% | 增大 open_files_limit |
| InnoDB Buffer Pool | 根據實際命中率、脏頁刷新壓力調整 | 切勿盲目設 50-80% 內存 |
參數調優帶來的性能提升通常是邊際的,**真正的數量級飛躍來自架構設計(分庫分表、讀寫分離、緩存層)、索引優化、SQL 重寫**。優化應左移到開發階段。
關注 xuliangwei.com 獲取更多架構實戰內容。