mysqld-nt.exe CPU 長期 100%
-- 匯出目前配置
mysqld.exe --help > output.txt
-- 發現 tmp_table_size = 32M (預設)
-- 修改 my.ini
[mysqld]
tmp_table_size = 200M
結果:CPU 從 100% 直線微降至 97%-100% 震盪。有改善但未根治。
-- 進入 MySQL Shell
SHOW PROCESSLIST;
-- 每秒重複執行 2-3 次觀察
發現網站 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 = '孔雀';
SHOW COLUMNS FROM _myuser;
SHOW COLUMNS FROM _mydata;
SHOW COLUMNS FROM _mydata_body;
SHOW COLUMNS FROM _mydata_key;
SQL 1 中 LEFT JOIN _myuser ... ON t1.userid = t3.userid 使用 _mydata.userid 做 JOIN 條件,但該欄無索引。
ALTER TABLE `_mydata` ADD INDEX (`userid`);
結果:CPU 降至 80% 左右。
SQL 2 對 33 萬筆資料在無索引的 keywords 欄位做全文掃描匹配。
ALTER TABLE `_mydata_key` ADD INDEX (`keywords`);
結果:CPU 立即降至 50%-70% 震盪。
發現同主機的幾個 Discuz 論壇也有類似缺索引問題,順手修復,CPU 進一步下降。
GROUP BY、ORDER BY、複雜查詢易產生臨時表SHOW PROCESSLIST 中 Using temporary 且耗時久的查詢,適度調大
WHERE col1=val1 AND col2=val2
(col1, col2) 複合索引 → 直接取行EXPLAIN 驗證執行計畫SHOW PROCESSLIST 與慢查詢日誌Created_tmp_disk_tables 狀態變數
-- 即時觀察執行緒
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
-- 檢視表結構
SHOW COLUMNS FROM tbl_name;
DESC tbl_name;
-- 增加索引
ALTER TABLE tbl_name ADD INDEX idx_name (col_name);
CREATE INDEX idx_name ON tbl_name (col_name);
-- 調整配置 (my.cnf/my.ini)
[mysqld]
tmp_table_size = 200M
max_heap_table_size = 200M -- 建議同步調整