首页 > 解决方案 > MySQL:优化子查询

问题描述

我有这个查询需要进一步优化,因为它需要太多的 cpu 时间,而且我似乎找不到任何其他方法来更有效地编写它。有没有另一种方法可以在不改变表格的情况下编写这个?

SELECT category, b.fruit_name, u.name
, r.count_vote, r.text_c
FROM Fruits b, Customers u
, Categories c
, (SELECT * FROM 
    (SELECT * 
     FROM Reviews 
     ORDER BY fruit_id, count_vote DESC, r_id
   ) a 
   GROUP BY fruit_id
) r
WHERE b.fruit_id = r.fruit_id 
AND u.customer_id = r.customer_id 
AND category = "Fruits";

标签: mysqlquery-optimizationgroupwise-maximum

解决方案


您的 Categories 表似乎没有与其他表连接/相关,这会在所有行之间产生 catesia 产品

如果您想要不同的结果,请不要使用 group by 但 distint 这样您就可以避免不必要的子查询

而且您不需要在子查询上订购

SELECT category
    , b.fruit_name
    , u.name
    , r.count_vote
    , r.text_c
FROM Fruits b
INNER JOIN  Customers u ON u.customer_id = r.customer_id
INNER JOIN  Categories c ON  ?????? /Your Categories table seems not joined/related  to the others  / 
INNER JOIN  (
    SELECT distinct fruit_id, count_vote, text_c, customer_id
    FROM Reviews    
) r ON  b.fruit_id = r.fruit_id 
WHERE category = "Fruits";

为了更好地阅读,您应该使用显式连接语法并避免基于逗号分隔的表名称和 where 条件的旧连接语法


推荐阅读