關鍵參數調整
| 參數 | 建議值 | 作用 |
| tmp_table_size | 200M (視記憶體) | 內部臨時表最大記憶體,超過轉磁碟 MyISAM |
| max_heap_table_size | 同 tmp_table_size | MEMORY 表/臨時表上限,取兩者較小值 |
| wait_timeout | 10-30 秒 | 非互動連線閒置斷開,防連線洩漏 |
| interactive_timeout | 60-300 秒 | 互動式客戶端閒置斷開 |
| low_priority_updates | 0 (關閉) | 開啟則 SELECT 優先於 INSERT/UPDATE (MyISAM) |
| table_open_cache / table_cache | 1024-4096 | 表描述符快取,減少開關表開銷 |
| thread_cache_size | 100-200 | 執行緒快取,減少建立/銷毀開銷 |
PHP 程式端配合
- 使用連線池 (mysqli 持久連線
mysqli::real_connect with MYSQLI_CLIENT_PERSISTENT)
- 腳本結束**顯式關閉連線** 或依賴
wait_timeout 清理
- 避免長連線持有鎖
記憶體分配估算公式 (參考)
總記憶體 = 系統保留 (1-2GB)
+ 全域緩衝區
+ innodb_buffer_pool_size (建議 50-70% 實體記憶體)
+ key_buffer_size (MyISAM 索引,若無 MyISAM 表可設小)
+ query_cache_size (MySQL 8.0 移除,舊版建議 0 或小值)
+ 線程獨享 * 最大連線數
+ sort_buffer_size (2-8MB)
+ join_buffer_size (2-8MB)
+ read_buffer_size (1-2MB)
+ read_rnd_buffer_size (1-2MB)
+ thread_stack (256KB-512KB)
+ 其他 (binlog cache, 等)
CPU 高常見原因排查清單
- 慢查詢:開啟
slow_query_log,EXPLAIN 分析、加索引、改寫 SQL
- 無索引/錯誤索引:全表掃描消耗 CPU
- 頻繁建立/銷毀連線:啟用連線池、調大
thread_cache_size
- 臨時表轉磁碟:調大
tmp_table_size/max_heap_table_size 或優化 SQL 避免臨時表
- 鎖爭用:
SHOW ENGINE INNODB STATUS 分析鎖等待、死鎖
- 統計資訊過期:
ANALYZE TABLE 更新
監控指標
SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables'; -- 磁碟臨時表計數
SHOW GLOBAL STATUS LIKE 'Created_tmp_tables'; -- 總臨時表
SHOW GLOBAL STATUS LIKE 'Threads_created'; -- 執行緒建立次數 (應緩慢增長)
SHOW PROCESSLIST; -- 即時活動