首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL CPU 100% 排查實戰:慢查詢定位 → 加索引 → 負載秒降

     編輯:MySQL 資料庫相關知識

現場

  • 伺服器 Load 持續 > 4
  • `top` 顯示 `mysqld` 佔 CPU 第 1
  • 重啟 MySQL 無效

定位:show processlist

mysql> SHOW PROCESSLIST;
-- 發現某站點兩條 SQL 長期佔用:
-- 1. SELECT * FROM bbs_message WHERE board_id=xxx AND parent_id=xxx
-- 2. SELECT * FROM bbs_message WHERE parent_id=xxx

嘗試失敗:調大 tmp_table_size

  • 預設 32MB → 改 256MB → 重啟 → **無改善**

根因分析:缺索引

mysql> SHOW COLUMNS FROM bbs_message;
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| msg_id    | int(11) | NO   | PRI | NULL    | auto_increment |
| board_id  | int(11) | NO   | MUL | 0       |                |
| parent_id | int(11) | NO   | MUL | 0       |                |
| root_id   | int(11) | NO   | MUL | 0       |                |
+-----------+---------+------+-----+---------+----------------+

雖有 `board_id`、`parent_id` 單欄索引,**但無複合索引支援 `WHERE board_id=? AND parent_id=?`**。

加索引

ALTER TABLE bbs_message ADD INDEX idx_parentid (parent_id);
ALTER TABLE bbs_message ADD INDEX idx_board_parent (board_id, parent_id);

驗證索引

mysql> SHOW INDEX FROM bbs_message;
+-------------+------------+------------------+--------------+-------------+-----------+
| Table       | Non_unique | Key_name         | Seq_in_index | Column_name | Collation |
+-------------+------------+------------------+--------------+-------------+-----------+
| bbs_message | 0          | PRIMARY          | 1            | msg_id      | A         |
| bbs_message | 1          | rootid           | 1            | root_id     | A         |
| bbs_message | 1          | idx_board_parent | 1            | board_id    | A         |
| bbs_message | 1          | idx_board_parent | 2            | parent_id   | A         |
| bbs_message | 1          | idx_parentid     | 1            | parent_id   | A         |
+-------------+------------+------------------+--------------+-------------+-----------+

結果

  • `top` Load 從 4+ **降至 0.x**,極度穩定
  • 問題 SQL 執行時間從秒級降至毫秒級

核心心法

  1. `SHOW PROCESSLIST` 找長期佔用 CPU 的 SQL
  2. `EXPLAIN` 看 `type=ALL`、`key=NULL`、`rows` 大
  3. **補上複合索引**覆蓋 WHERE 條件順序
  4. 驗證 `SHOW INDEX`、再跑 `PROCESSLIST` 確認消失

結語

MySQL CPU 100% **九成是缺索引**。別調參數、別加記憶體,**先看 processlist、再看 EXPLAIN、補索引**,立竿見影。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved