面試經典問題
「MySQL 預設安裝完成,應調整哪些參數?」只有少數關鍵參數對大多數負載有決定性影響,其餘多為微調。
核心全域參數 (按重要性排序)
1. key_buffer_size (MyISAM 專用)
- 純 MyISAM:實體記憶體 30-40%
- 混合/少量 MyISAM:16-32MB (供臨時表索引)
- 檢查
Key_reads/Key_read_requests 命中率 > 99%
2. innodb_buffer_pool_size (InnoDB 核心) ⭐
- 專用 InnoDB:實體記憶體 70-80%
- 包含資料頁、索引頁、鎖、插入緩衝、自適應雜湊索引
- 無需預留 OS Cache 空間 (InnoDB 自管)
- 小資料集勿過大,避免浪費
3. innodb_log_file_size (寫入效能關鍵)
- 大寫入負載:64M-512M
- 越大 = Checkpoint 越少 = 效能越好,但崩潰恢復越慢
- 總大小 =
innodb_log_files_in_group * innodb_log_file_size ≤ Buffer Pool 25%
4. innodb_flush_log_at_trx_commit (效能與安全權衡) ⭐
| 值 | 行為 | 適用場景 |
| 1 (預設) | Commit 即 fsync | 核心交易、資金、訂單 |
| 2 | Commit 寫 OS Cache,1秒 fsync | 日誌、快取、可重算資料 |
| 0 | 1秒寫 Log 並 fsync | 極高寫入、可容忍秒級丟失 |
5. innodb_log_buffer_size
- 中等寫入/短事務:預設 8MB 足夠
- 大事務/Blob/寫入峰值:16-64MB
- 每秒刷盤,無需設 > 1秒產生量
6. table_cache / table_open_cache
- 百表級:1024-2048
- 千表/高併發:5000-10000+
- 每連接獨立 open table handle,關聯
open_files_limit
7. thread_cache_size
- 預設 0 → 每連接建立/銷毀線程開銷大
- 建議 16-64,觀察
Threads_created 穩定不增長為宜
8. query_cache_size (5.7 棄用, 8.0 移除)
- 唯讀密集、無應用層快取:32M-512M
- 過大導致鎖爭用反而降速,監控
Qcache_hits/Inserts 命中率
- 寫入頻繁表建議關閉 (
query_cache_type=0)
會話級參數 (第二步調優)
sort_buffer_size, read_buffer_size, join_buffer_size, tmp_table_size 等視具體慢查詢 EXPLAIN 結果調整。簡單查詢無需加大,反而可能因記憶體分配開銷降速。
實用模板
MySQL 發布版自帶 my-small.cnf, my-medium.cnf, my-large.cnf, my-huge.cnf, my-innodb-heavy-4G.cnf,按硬體選擇最近者微調即可,優於手動從零開始。
- 上一篇文章: MySQL 從 MyISAM 轉換 InnoDB 完整遷移實戰與錯誤排查
- 下一篇文章: 解決 PHP 後台頻繁「無法連接 MySQL」刷新即恢復的兩大方案
Copyright ©
程式碼之家 All Rights Reserved