cdb_posts 1740 萬筆,總資料 > 2000 萬,DB > 1GB。SHOW PROCESSLIST 觀察高頻 SQL。SHOW COLUMNS FROM tbl 檢查 WHERE/JOIN/ORDER BY 欄位是否有索引。ALTER TABLE ... ADD INDEX 補齊缺失索引。
ALTER TABLE `cdb_pms` ADD INDEX (`folder`);
ALTER TABLE `cdb_threads` ADD INDEX (`displayorder`);
ALTER TABLE `cdb_threads` ADD INDEX (`dateline`);
ALTER TABLE `cdb_threads` ADD INDEX (`closed`);
ALTER TABLE `cdb_threadsmod` ADD INDEX (`dateline`);
ALTER TABLE `cdb_sessions` ADD INDEX (`invisible`);
ALTER TABLE `cdb_forums` ADD INDEX (`type`);
ALTER TABLE `cdb_forums` ADD INDEX (`displayorder`);
| 慢 SQL 片段 | 缺失索引 | 影響 |
|---|---|---|
WHERE msgfromid=... AND folder='outbox' | folder | 全表掃描 7823 行 × 高頻 |
WHERE t.displayorder>=0 (common.inc.php) | displayorder | 核心列表查詢,11 萬行全掃 |
ORDER BY t.dateline DESC (rss.php) | dateline | Filesort 導致 CPU 飆升 |
WHERE invisible=0 (forumdisplay.php) | invisible | Session 表雖小但高頻 |
SELECT t.*, f.name FROM cdb_threads t, cdb_forums f
WHERE t.fid<>'S' AND f.fid=t.fid AND f.fid NOT IN (...)
AND t.closed NOT LIKE 'S' AND t.replies != N
AND t.displayorder>=N ORDER BY t.views DESC LIMIT N, N
問題:
t.closed NOT LIKE 'S':數值欄位用 LIKE,型別轉換導致索引失效。ORDER BY t.views:無索引 Filesort。SELECT t.*:不建議,增加傳輸與緩衝壓力。t.fid <> 'S':數值欄位用字串比較。解決:關閉插件 → CPU 降至 18%。建議:插件改用定時任務生成靜態快取。
許多站點從低版本升級,程式碼更新但資料庫結構未同步補索引,導致千萬級資料量時效能崩塌。
SHOW PROCESSLIST、slow_query_log、mysqldumpslow、EXPLAIN。EXPLAIN。