mysqld-nt.exe CPU 長期 100%,停用某網站 (網站 A) 後立即下降,啟用即飆升。tmp_table_size (微調)[mysqld]
tmp_table_size=200M
重啟 MySQL 後 CPU 從持續 100% 微降至 97~100%,證明參數調整有效但非核心原因。
SHOW PROCESSLIST 定位高頻 SQL每秒刷新兩次,發現網站 A 兩條 SQL 高頻出現:
-- SQL 1
SELECT t1.pid, t2.userid, t3.count, t1.date
FROM _mydata AS t1
LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid
LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid
ORDER BY t1.pid LIMIT 0,15
-- SQL 2
SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid=t2.pid AND t2.keywords = '孔雀'
_mydata 只有主鍵 pid,userid 無索引 → JOIN 時全表掃描。_mydata_key 33 萬筆,keywords 無索引 → 文字搜尋全表掃描。ALTER TABLE `_mydata` ADD INDEX (`userid`);
-- CPU 降至 80% 左右
ALTER TABLE `_mydata_key` ADD INDEX (`keywords`);
-- CPU 降至 50~70%
後續順手處理幾個 Discuz 論壇表的同類問題,CPU 進一步降低穩定。
tmp_table_size:預設 32M,臨時表超過會轉磁碟 (MyISAM),大量 GROUP BY / 複雜查詢建議加大 (如 64M~256M),減少磁碟 I/O。INDEX (col1, col2) 可支援 WHERE col1=... AND col2=... 或 ORDER BY col1, col2。資料表設計時須通盤考慮查詢模式,預先規劃索引;上線前用 EXPLAIN 分析執行計畫,確認 type 非 ALL (全表掃描)。