MySQL 優化是系統工程,而非單點調參。本文遵循「硬件 → 架構 → 參數 → SQL → 維護」五步法,從根源解決效能瓶頸。
| 資源 | 瓶頸表現 | 優化方向 |
|---|---|---|
| 磁盤尋道 (IOPS) | 隨機讀寫慢,7200 RPM 理論 7200 IOPS | 多磁盤分佈、RAID 10、SSD/NVMe、分庫分表 |
| 磁盤吞吐 | 順序讀寫帶寬滿載 | 多磁盤並行、壓縮、減少全表掃描 |
| CPU | 小表高頻計算、複雜函數、排序 | 優化 SQL、減少函數、適當增加核心 |
| 內存 | 熱數據超出 Buffer Pool、排序臨時表寫磁盤 | 增加內存、調大 innodb_buffer_pool_size |
主庫寫、從庫讀,利用 Proxy(ProxySQL/MaxScale)或代碼層路由。
Redis 緩存熱點數據(用戶會話、商品詳情、計數器),降低 DB QPS 90%+。
[mysqld]
# 連接層
max_connections = 3000
back_log = 500
max_connect_errors = 100000
# 內存核心 (InnoDB)
innodb_buffer_pool_size = 12G # 物理內存 60-70%
innodb_buffer_pool_instances = 8
innodb_log_file_size = 1G # 大紅日志減少 checkpoint 壓力
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1 # 1=最安全, 2=高性能(秒級丟失)
innodb_flush_method = O_DIRECT # 繞過 OS cache
# 查詢緩存 (8.0 已移除,改用 ProxySQL/Redis)
# query_cache_type = 0
# 臨時表、排序
tmp_table_size = 256M
max_heap_table_size = 256M
sort_buffer_size = 4M
join_buffer_size = 4M
read_rnd_buffer_size = 8M
# 連接、超時
interactive_timeout = 300
wait_timeout = 300
net_read_timeout = 30
net_write_timeout = 60
# 其它
open_files_limit = 65535
table_open_cache = 4000
table_definition_cache = 2000
max_allowed_packet = 64M
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
slow_query_log=1, long_query_time=1,配合 pt-query-digest 分析。ANALYZE TABLE 更新統計信息。優化順序決定成敗:硬件兜底 → 架構分流 → 參數匹配 → SQL 重構 → 維護保障。切勿上來就改參數、加索引,而忽略了架構層面的讀寫分離、分庫分表、緩存策略。系統化優化,方能長治久安。