MySQL 優化不是單一維度的參數調整,而是硬件 → 作業系統 → 文件系統 → MySQL 服務器 → SQL/索引 → 應用架構的系統工程。本文從五大維度給出可落地的優化清單。
mkfs.xfs -f -i size=512 /dev/nvme0n1 加大 inode。noatime,nodiratime,discard(SSD TRIM),減少元數據寫入。none (noop);HDD 用 deadline 或 bfq。vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
fs.file-max = 1000000[mysqld]
# 內存核心
innodb_buffer_pool_size = 0.7 * 物理內存
innodb_buffer_pool_instances = 8
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_io_capacity = 20000 # NVMe IOPS
innodb_io_capacity_max = 40000
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_purge_threads = 4
innodb_page_cleaners = 4
# 連接與緩存
max_connections = 5000
thread_cache_size = 100
table_open_cache = 10000
table_definition_cache = 5000
open_files_limit = 1000000
# 查詢優化
optimizer_switch = 'mrr=on,mrr_cost_based=off,batched_key_access=on'
join_buffer_size = 2M
sort_buffer_size = 4M
read_rnd_buffer_size = 4M
# 安全與復制
sync_binlog = 1
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON
expire_logs_days = 7
# 字符集
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
long_query_time=0.5,配合 pt-query-digest 定期分析 Top 10。IN (subquery) → EXISTS / JOINOR → UNION ALL分頁 LIMIT 100000,20 → 延遲關聯 / 游標式 (WHERE id > last_id)COUNT(*) → 近似值 SHOW TABLE STATUS / 觸發器維護計數表| 模式 | 適用場景 | 關鍵技術 |
|---|---|---|
| 讀寫分離 | 讀多寫少 (QPS 讀/寫 > 10:1) | ProxySQL / MaxScale / 代碼路由;從庫延遲監控 |
| 垂直分庫 | 業務模塊耦合低、表數多 | 微服務拆分、分布式事務 (Seata/TCC) |
| 水平分表 | 單表 > 2000萬行 / > 20GB | ShardingSphere / Vitess / 自研路由 (hash/range) |
| Redis 緩存 | 熱點數據、計數器、Session | Cache-Aside / Read-Through / Write-Behind;一致性方案 |
| 異步寫入 | 日誌、統計、非核心業務 | Kafka/RocketMQ + 消費者寫 DB;峰值削峰填谷 |
MySQL 優化無終點,只有持續迭代。記住優先級金字塔:
SQL/索引 (零成本、立竿見影) > 參數調優 (需重啟、效果邊際) > 硬件/架構 (成本高、上限高)。建立「慢查詢治理周報 → 參數基線版本化 → 壓測驗證 → 灰度發布」閉環,才能讓 PHP+MySQL 系統長期穩定「飛」起來。