Windows 2003 + IIS + PHP + MySQL 環境,10 個網站共用單一 MySQL 實例。某網站(日 IP 2000、PV 3萬、資料量 60 萬筆/45MB)啟用後 mysqld-nt.exe CPU 長期 100%,停用該站 CPU 即降正常。
tmp_table_size 觀察效果tmp_table_size=32M,臨時表超限寫磁碟導致效能抖動my.ini:tmp_table_size=200MSHOW PROCESSLIST 定位高頻 SQLmysql> SHOW PROCESSLIST;
-- 反覆出現兩條慢查詢:
-- Query 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;
-- Query 2
SELECT COUNT(*)
FROM _mydata AS t1, _mydata_key AS t2
WHERE t1.pid = t2.pid AND t2.keyWords = '孔雀';
SHOW COLUMNS 發現索引缺失| 表名 | 現有索引 | 查詢用到的欄位 | 缺失索引 |
|---|---|---|---|
| _mydata | PRIMARY KEY (pid) | userid (JOIN ON) | INDEX (userid) |
| _mydata_key | PRIMARY KEY (pid) | keyWords (WHERE) | INDEX (keyWords) |
ALTER TABLE `_mydata` ADD INDEX (`userid`);
-- CPU 降至 80% 左右
ALTER TABLE `_mydata_key` ADD INDEX (`keyWords`);
-- CPU 降至 50%~70% 震盪,目標 SQL 消失
補齊相同模式的缺失索引,CPU 進一步下降至正常水位。
tmp_table_size、max_heap_table_size 成對調大,避免臨時表落盤Created_tmp_disk_tables 狀態變數,持續增長即需調大
WHERE、JOIN、ORDER BY、GROUP BY、MAX()/MIN() 條件欄位必須建立索引
tmp_table_size、innodb_buffer_pool_size 等)SHOW PROCESSLIST 高頻捕捉慢 SQLEXPLAIN 分析執行計畫,找 type=ALL(全表掃描)SHOW INDEX / SHOW COLUMNS 對照條件欄位,補索引本案例中,單純調參數僅治標;補齊 JOIN/WHERE 條件欄位的索引才是治本。開發階段即納入索引設計評審,配合上線後慢查詢日誌持續巡檢,才能從根源避免 CPU 100% 故障。