MySQL 性能調優的本質是**在有限硬件資源(CPU、內存、磁盤、網絡)下,最大化吞吐與最小化延遲**。本文從連接層參數、全局/會話級緩衝區模型、查詢緩存、表緩存、配置文件選型五個維度,構建科學化調優知識體系,並給出生產環境參數計算公式與驗證方法。
| 參數 | 含義 | 調優指引 | 監控指標 |
|---|---|---|---|
max_connections | 最大並發連接數 | 根據業務峰值 QPS × 平均事務耗時 × 1.5 安全係數估算;典型 1000-5000。過大導致內存壓力、線程調度開銷 | Threads_connected、Max_used_connections、Connection_errors_max_connections |
back_log | TCP 監聽隊列長度(內核參數 somaxconn 上限) | 突發連接風暴時緩衝;建議 256-1024,受限於 OS /proc/sys/net/core/somaxconn | Connection_errors_internal、Connection_errors_tcpwrap |
max_user_connections | 單用戶最大連接數 | 防單租戶佔用所有連接;按業務隔離設置 | - |
MySQL 內存佔用 = **全局緩衝(啟動即分配,常駐)** + **會話級緩衝(連接建立/操作時動態分配,釋放)**。
| 參數 | 作用 | 建議值/計算 | 監控指標 |
|---|---|---|---|
innodb_buffer_pool_size | InnoDB 數據+索引頁緩存,**最關鍵參數** | 專用 DB 服務器:**物理內存 60%-80%**;混部環境酌減。大於數據集則 100% 命中 | Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests < 1% ;Innodb_buffer_pool_pages_free |
innodb_buffer_pool_instances | 緩存池分區數,減少鎖爭用 | 1-8 個,每實例 ≥ 1GB;總大小 = innodb_buffer_pool_size | - |
innodb_log_buffer_size | 事務日志寫入緩存 | 16-64MB;大事務/高併發寫入調大至 128-256MB | Innodb_log_waits > 0 時調大 |
key_buffer_size | MyISAM 索引塊緩存 | 若仍有 MyISAM 表:64-256MB;純 InnoDB 可設 8-16MB(僅用於臨時表) | Key_reads / Key_read_requests < 0.01 |
query_cache_size | 查詢結果緩存(**8.0 已移除**) | 5.7:建議 0 禁用。高併發寫入下鎖爭用嚴重,命中率低反拖性能 | Qcache_hits、Qcache_lowmem_prunes、Qcache_not_cached |
table_open_cache | 表定義緩存(.frm/.ibd 文件句柄) | 4000-20000,按 Open_tables 峰值 × 1.5 設置 | Open_tables、Opened_tables 增長快則調大 |
table_definition_cache | 表結構定義緩存 | 1400-4000,通常 = table_open_cache / 4 | - |
| 參數 | 觸發場景 | 默認值 | 調優建議 | 風險提示 |
|---|---|---|---|---|
read_buffer_size | 全表掃描順序讀取 | 128KB | 256KB-1MB;大表頻繁全掃描可適當調大 | × 連接數 = 總內存壓力 |
read_rnd_buffer_size | 排序後隨機讀取(如 ORDER BY、filesort) | 256KB | 256KB-1MB;大排序場景調大 | 同上 |
sort_buffer_size | ORDER BY/GROUP BY 內存排序 | 256KB | 256KB-2MB;優先優化索引避免 filesort,不可盲目調大 | 大值導致內存碎片、OOM |
join_buffer_size | 無索引聯結(Block Nested Loop) | 256KB | 256KB-1MB;**優先加索引消除 BNL**,極少數無法加索引場景調大 | 同上 |
tmp_table_size / max_heap_table_size | 內存臨時表(HEAP)上限,超限轉 MyISAM 磁盤表 | 16MB | 64-256MB;配合 Created_tmp_disk_tables 監控 | 過大易 OOM |
thread_stack | 線程棧大小 | 256KB | 保持默認,除非複雜存儲過程棧溢出 | - |
binlog_cache_size | 事務 Binlog 緩存 | 32KB | 大事務調大至 1-4MB | Binlog_cache_disk_use > 0 時調大 |
總內存 ≈ 全局緩衝總和
+ max_connections × (read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size + thread_stack + binlog_cache_size)
+ 並發查詢峰值 × (tmp_table_size) -- 臨時表不一定每連接都分配
+ OS 保留 (1-2GB) + 其他進程
**鐵律**:32 位系統進程地址空間 ≤ 2.5-3GB,**64 位系統無此限制**。生產必用 64 位 OS + 64 位 MySQL。
| 模板文件 | 適用場景 | 核心預設差異 |
|---|---|---|
my-small.cnf | 嵌入式/開發機,內存 ≤ 256MB | 極小緩衝,關閉多數特性 |
my-medium.cnf | 中小應用,內存 512MB-2GB | 平衡型,**生產常用基準** |
my-large.cnf | 大內存專用 DB,4-8GB | 大緩衝、高並發參數 |
my-huge.cnf | 超大內存專用 DB,16GB+ | 激進緩衝、大事務參數 |
**部署流程**:
/etc/my.cnf (Linux) 或 my.ini (Windows)innodb_buffer_pool_size、max_connections、table_open_cache 等)mysqld --validate-config 語法檢查 → 重啟生效SHOW GLOBAL STATUS 核心指標 24-48h,微調會話級緩衝max_connections/back_loginnodb_buffer_pool_size、innodb_flush_method=O_DIRECTsort_buffer_size、tmp_table_size、優先加索引table_open_cachemy.cnf 納入 Git,變更記錄含業務場景、預期效果、回滾方案MySQL 調優無銀彈,**核心是「給熱數據足夠內存(Buffer Pool)、給高並發足夠連接槽、給複雜查詢足夠索引」**。會話級緩衝參數**默認即可,極少調大**;全局緩衝參數**按業務數據量科學計算**;配置文件**從模板起步,版本控制演進**;監控體系**全鏈路可觀測,單參數閉環驗證**。遵循科學方法論,拒絕玄學調參。