mysql - select 语句中的多个聚合是否会引起性能问题?

标签 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 

最佳答案

作为一般性答案,我会说,不。但是,只有 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/

相关文章:

mysql - 在同一个表中显示子和父关系(如果有)

mysql - 是什么导致了错误(操作数应包含 1 列)

php - 如何在 Laravel 5.2 中连接两个模型

php - 定期更新表

mysql - 如何删除MySQL中重复的​​连接表记录?

php - MySQL 中删除按除 ID 之外的所有分组的重复行的最佳方法?

php - 将 PHP MYSQL 中类别表中的所有顶级类别作为 Optgroup

python - sqlalchemy 连接到 VPS 数据库

php - 找到 .ini 文件但内容丢失(parse_ini_file() 不工作)

java - 我如何在java中找到用户位置