Mysql
使用 Order 和 Group by 進行慢速 MySQL 查詢
我有一個查詢需要很長時間才能執行(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
我發現通過刪除
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