3

哪些表和列应该有索引?我在 flow_permanent_id 和 entry_id 上有一个索引,但它似乎在使用文件排序?

我能做些什么来优化这个?

mysql> explain SELECT COUNT(*) AS count_all, entry_id AS entry_id FROM `votes` WHERE `votes`.`flow_permanent_id` = '4fab490cdc1c82cfa800000a' GROUP BY entry_id;
+----+-------------+-------+------+----------------------------------+----------------------------------+---------+-------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys                    | key                              | key_len | ref   | rows | Extra                                        |
+----+-------------+-------+------+----------------------------------+----------------------------------+---------+-------+------+----------------------------------------------+
|  1 | SIMPLE      | votes | ref  | index_votes_on_flow_permanent_id | index_votes_on_flow_permanent_id | 74      | const |    1 | Using where; Using temporary; Using filesort |
+----+-------------+-------+------+----------------------------------+----------------------------------+---------+-------+------+----------------------------------------------+
1 row in set (0.00 sec)
4

2 回答 2

7

为了避免文件排序,您需要在 ( flow_permanent_id, entry_id) 上使用复合索引,以便 MySQL 可以将索引用于 WHERE 和 GROUP BY。

于 2012-05-15T22:31:30.677 回答
1

首先 - 使用 COUNT(1) 而不是 COUNT( * ),在某些情况下可能会提高性能。永远不要使用 COUNT(*)。

第二:看起来您使用了索引,它列在 EXPLAIN 输出的“键”列中。您的“GROUP BY”是导致文件排序的原因。通常是 ORDER BY 是罪魁祸首,但我已经看到 GROUP BY 也可以做到这一点。

希望这可以帮助。

于 2012-05-15T22:41:11.483 回答