选择语句中的多个聚合是否会影响性能?

时间:2019-03-01 14:34:55

标签: mysql

考虑到下面的简单语句,我在客户表中使用了SUM和COUNT值,但我也想使用这些值来计算第三列average_sale。

我立即尝试只使用看起来更清晰的列别名,但是我不得不再次使用SUM和COUNT。

这是表演者吗?

SELECT 
    SUM(payments.amount) as total_sales, 
    COUNT(payments.id) as quantity, 
    SUM(payments.amount) / COUNT(payments.id) as average_sale, 
    `users`.`name`, 
    `payments`.`user_id` 
FROM `payments` 
INNER JOIN `users` on `payments`.`user_id` = `users`.`id` 
GROUP BY `payments`.`user_id` 
ORDER BY `total_sales` DESC 

1 个答案:

答案 0 :(得分:0)

作为一般性回答,我会说不。但是,只有SQL执行计划可以说明

在您的情况下,您将多次重复使用相同的聚合表达式。甚至一个基本的SQL优化器也应该意识到它们是相同的,并且每次都会计算一次。

由于您的查询没有过滤条件,因此它将整体读取两个表。您查询的最大成本可能与加入顺序有关。它应该以{{1​​}}开始,然后步行到payments,反之亦然吗?索引的存在/不存在可能是决定性的。

编辑:

现在,如果您发现优化器不是那么聪明,则可以通过使用子查询(或使用MySQL 8.x的CTE)来确保它仅计算一次聚合。例如,您可以将查询改写为:

users