gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:52:32 27 4
gpt4 key购买 nike

我有一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com