考虑下面的简单语句,我在客户表中使用 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
最佳答案
作为一般性答案,我会说,不。但是,只有 SQL 执行计划才能说明问题。
在您的情况下,您多次重复使用相同的聚合表达式。即使是基本的 SQL 优化器也应该意识到它们是相同的,并且会一次性计算每一个。
由于您的查询没有过滤条件,因此它会读取整个表。查询的最大成本可能与连接顺序有关。它应该从付款
开始,然后走向用户
,还是反之亦然?索引的存在/不存在在这里可能是决定性的。
编辑:
现在,如果您发现优化器不是那么聪明,您可以通过使用子查询(或 CTE,如果使用 MySQL 8.x)来确保它只计算每个聚合一次。例如,您可以将查询改写为:
select
total_sales,
quantity,
total_sales / quantity as average_sale,
`name`,
`user_id`
from (
SELECT
SUM(payments.amount) as total_sales,
COUNT(payments.id) as quantity,
`users`.`name`,
`payments`.`user_id`
FROM `payments`
INNER JOIN `users` on `payments`.`user_id` = `users`.`id`
GROUP BY `payments`.`user_id`
) x
ORDER BY `total_sales` DESC
关于mysql - select 语句中的多个聚合是否会引起性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54946741/