mysql - 选择查询中重复聚合函数的性能

标签 mysql sql performance

我有一个 SQL 查询(在 MySQL 中),它选择一个总数以及有多少已完成任务的计数:

SELECT
  count(*) as total, IF(SUM(NOT `completed`) IS NULL,0,SUM(NOT `completed`)) as incomplete
FROM
  tasks

表格可以做成这样:

CREATE TABLE `tasks` (
  `clave` int(11) NOT NULL AUTO_INCREMENT,
  `completed` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'If it is 0 isn\'t completed, otherwise is completed',
  PRIMARY KEY (`clave`)
) ENGINE=InnoDB;

您可以观察到,在查询中我使用了两次 SUM(NOT completed),一次是检查它是否会返回 null(并返回 0),一次是返回计数(当它不为空)。 SUM() 函数返回 null 如果表(或查询)为空,即表根本没有行。

由于您尝试求和两次,我认为 MySQL 会计算两次总和。

我已经测试过是否可以为该列设置一个别名,然后在 IF 中使用它,这样 mysql 就不需要重新计算它。

作为一项要求,不完整的列在任何情况下都不能为空(例如,如果表任务为空)。

我的问题是,这样有效率吗? MySQL 是否需要每次都重新计算总和或者它会记住它?

最佳答案

这可能是更好的方法,因为您对性能

的计算较少

使用 richard 发布的架构 - 参见 FIDDLE

SELECT 
    total, 
    num_complete, 
    total - num_complete as num_incomplete
FROM(
    SELECT
        COUNT(*) as total,
        SUM(IF(t.completed > 0, 1, 0)) as num_complete
    FROM status_log t
) as t

根据 OP 请求检查空表

SELECT 
    total, 
    num_complete, 
    total - num_complete as num_incomplete
FROM(
    SELECT
        COUNT(*) as total,
        IF(COUNT(*) > 0, SUM(IF(t.completed > 0, 1, 0)), 0) as num_complete
    FROM status_log t
) as t

你应该用另一种编程语言检查 null 或空表 ...一般来说 SQL 应该用于从表中查询..不是当它是空的时候......如果它完全是空的,那么在以另一种编程语言运行此查询时,您应该检查是否有空响应。这将大大提高它的性能

关于mysql - 选择查询中重复聚合函数的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23476186/

相关文章:

javascript - jQuery bind() unbind() 和 on() 和 off()

c# - 事件代码是否比 C# 中的虚拟/重写方法更适合缓存?

mysql - 如何在 MySQL 中实现负向先行正则表达式匹配

MySQL 5.7强制使用/创建MyISAM

mysql - 如何将 MySQL 查询结果存储在另一个表中?

php - 我这里的错误是什么,显示 SQL 语法错误?

mysql - 使用 group by 仅更新具有最大值的记录

sql - 如何在 SQL Server 中查找列中的重复文本并删除重复项

c# - 这运行缓慢是因为它在 LINQ 中,还是因为我做得不好?

javascript - javascript 加载速度慢,代码看起来很大?