資料庫效能調校遵循「硬體 → 參數 → 查詢」三層次,效果遞減但成本也遞減。本文聚焦參數調校與慢查詢識別,查詢優化另文詳述。
innodb_buffer_pool_size| 參數 | 建議值 | 說明 |
|---|---|---|
innodb_buffer_pool_size | 實體記憶體 70-80% | 資料與索引快取核心,避免磁碟 I/O |
innodb_log_file_size | 1-4 GB | 大紅寫緩衝,減少 checkpoint 壓力 |
innodb_flush_log_at_trx_commit | 1 (生產) / 2 (可容忍秒級丟失) | ACID 核心,1 最安全 |
innodb_file_per_table | ON | 獨立表空間,利於管理與回收空間 |
innodb_io_capacity | SSD: 2000-5000 / HDD: 200 | 背景刷頁能力上限 |
| 參數 | 建議值 | 說明 |
|---|---|---|
max_connections | 500-2000 | 配合應用連線池設定,避免 Too many connections |
table_open_cache | 4000+ | 避免頻繁開關表,配合 open_files_limit |
query_cache_type | OFF (5.7+) / DEMAND (舊版) | 查詢快取有鎖爭用,8.0 已移除 |
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 # 超過 1 秒記錄 log_queries_not_using_indexes = 1 # 記錄無索引查詢 log_slow_admin_statements = 1 # 記錄管理指令 min_examined_row_limit = 100 # 忽略掃描少於 100 行的查詢
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
pt-query-digest /var/log/mysql/slow.log --limit 20 --filter '$event->{fingerprint} !~ /^SET/'
EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 'paid'; -- 重點看:type (ref/range/ALL)、key、rows、Extra (Using where/index/temporary/filesort)
EXPLAIN,確認是否全表掃描 (type=ALL)SHOW INDEX FROM table調校是持續迭代過程:「監控 → 發現瓶頸 → 調整參數/索引/查詢 → 驗證 → 監控」。建議建立變更管理流程,所有參數變更留存紀錄與回滾方案。