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
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 |
+-------------+------------+------------------+--------------+-------------+-----------+
MySQL CPU 100% **九成是缺索引**。別調參數、別加記憶體,**先看 processlist、再看 EXPLAIN、補索引**,立竿見影。