Mysql

使用 Order 和 Group by 進行慢速 MySQL 查詢

  • January 30, 2013

我有一個查詢需要很長時間才能執行(1.13 秒)。這兩個表user_articlesarticles大約 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

我發現通過刪除ORDER BY語句可以加快速度(0.003 秒)。這些是來自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                                  |
+----+-------------+---------------+--------+---------------+------------+---------+-------------+-------+----------------------------------------------+

有什麼辦法可以加快查詢速度嗎?

正如@Back in a Flash 所建議的那樣,如果優化器選擇使用它,in 上的索引created_at可能user_articles會有所幫助……但優化器可能無法了解該索引的可行性,因為您正在做其他需要解釋。

你正在使用GROUP BY,但你沒有聚合我能看到的任何東西。如果您不是在尋找 MIN()、MAX()、SUM()、COUNT() 或一些類似聚合函式的結果,那麼您在GROUP BY此處的使用是不正確的。預設情況下,MySQL 在這樣GROUP BY使用時不會拋出錯誤。

看起來 user_articles 中的多行可以引用文章中的同一行。如所寫,您的查詢將僅從 user_articles 為文章中每個引用的行返回一個匹配行,並且該行的選擇將不是確定性的。

這似乎不是你想要做的。如果是這樣,你不應該這樣做。:)

如果不是……或者如果 user_articles 中的每一行都引用了文章中的唯一行,那麼您的查詢會不必要地加重優化器的負擔,因為它堅持認為這確實是它希望伺服器嘗試做的事情。在編寫查詢GROUP BY時,充其量是多餘的,並且可能會導致性能問題,因為即使您有一個索引 on ,這與伺服器也需要(可能)不同的索引 created_at這一事實相衝突。GROUP BY

引用自:https://dba.stackexchange.com/questions/33789