本文聚焦第 2、3 層:配置 mysqld 並建立慢查詢可觀測體系。
| 參數 | 建議值/原則 | 說明 |
|---|---|---|
| innodb_buffer_pool_size | 物理記憶體 60-80% | InnoDB 核心快取,資料+索引+鎖+插入緩衝,越大越少磁碟 I/O |
| innodb_log_file_size | 1-4 GB | 大檔案減少 checkpoint 頻率,寫入效能提升 |
| innodb_flush_log_at_trx_commit | 1 (安全) / 2 (效能) | 1=每次提交 fsync,2=每秒 fsync,0=依賴 OS |
| max_connections | 應用峰值 + 余量 | 配合 thread_pool 或連線池避免爆連接 |
| table_open_cache | 4000+ | 減少 .frm 重複開關開銷 |
| query_cache_type | 0 (關閉) | 高並發下鎖爭用嚴重,8.0 已移除 |
| slow_query_log | ON | 啟用慢查詢日誌 |
| long_query_time | 1-2 (秒) | 閾值,視業務調整 |
| log_queries_not_using_indexes | ON | 記錄未用索引查詢 (即使快) |
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
mysqldumpslow -s t -t 20 /var/log/mysql/slow.log
# -s t: 按總耗時排序
# -t 20: 顯示前 20
# 自動抽象化參數值,同模式查詢合併統計
pt-query-digest /var/log/mysql/slow.log --limit 20 --filter '$event->{Query_time} > 1'
輸出含:執行次數、總/平均/最大耗時、掃描行數、回傳行數、索引使用率、EXPLAIN 計畫、優化建議。
EXPLAIN 分析執行計畫:type=ALL 全表掃描、key=NULL 無索引、rows 巨大FLUSH LOGS 切割日誌,觀察次日 Top 榜變化iostat -x 1:%util > 80% 或 await > 20ms → 磁碟瓶頸vmstat 1:wa (I/O wait) 持續 > 20% → 磁碟/記憶體壓力free -h:available 過低 → 擴充記憶體或降低 innodb_buffer_pool_sizetop -H:mysqld 佔用單核 100% → 單查詢無法並行,需改寫或升級 CPU