使用 Order 和 Group by 进行慢速 MySQL 查询

xyl*_*lar 3 mysql performance order-by group-by query-performance

我有一个需要很长时间才能执行的查询(1.13 秒)。这两个表user_articles,并articles有大约25,000记录。这是查询:

SELECT `user_articles`.*
FROM `user_articles`
INNER JOIN `articles` ON (`user_articles`.`article_id` = `articles`.`id`)
GROUP BY `articles`.`id`
ORDER BY `user_articles`.`created_at` DESC
Run Code Online (Sandbox Code Playgroud)

我发现通过删除ORDER BY语句可以加快速度(0.003s)。这些是从结果EXPLAIN

+----+-------------+---------------+--------+---------------+------------+---------+-------------+-------+----------------------------------------------+
| id | select_type | table         | type   | possible_keys | key        | key_len | ref         | rows  | Extra                                        |
+----+-------------+---------------+--------+---------------+------------+---------+-------------+-------+----------------------------------------------+
| 1  | SIMPLE      | articles      | index  | PRIMARY       | PRIMARY    | 4       | NULL        | 22678 | Using index; Using temporary; Using filesort |
| 1  | SIMPLE      | user_articles | ref    | article_id    | article_id | 4       | articles.id | 1     | Using where                                  |
+----+-------------+---------------+--------+---------------+------------+---------+-------------+-------+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

有什么办法可以加快查询速度吗?

Mic*_*bot 5

正如 Flash 中的 @Back 所建议的那样,如果优化器选择使用created_atin上的索引user_articles可能会有所帮助……但是优化器可能无法抓住该索引的可行性,因为您正在做其他需要解释。

你正在使用,GROUP BY但你没有聚合我能看到的任何东西。如果您不是在寻找 MIN()、MAX()、SUM()、COUNT() 或某些类似聚合函数的结果,那么您在GROUP BY此处的使用是不正确的。默认情况下,MySQL 在这样GROUP BY使用时不会抛出错误。

看起来好像 user_articles 中的多行可以引用文章中的同一行。您的查询,如所写,只会从 user_articles 为文章中的每个引用行返回一个匹配行,并且该行的选择将不是确定性的

这似乎不是你想要做的。如果是这样,你不应该这样做。:)

如果不是……或者如果 user_articles 中的每一行都引用了文章中的唯一行,那么您的查询通过坚持认为这确实是它希望服务器尝试执行的操作而不必要地加重了优化器的负担。在编写查询时GROUP BY, 充其量是多余的,并且可能会导致性能问题,因为即使您在 上有索引created_at,这与服务器也需要GROUP BY(可能)不同的索引这一事实相冲突。