mysql - MySQL执行顺序
问题描述
我正在运行一个很长的查询,如下所述。它为自动化系统上的每个帐户获取下一个所需的操作。
IE
SELECT Account.id,
(IFNULL(**Should send message query**,
IFNULL(**Should check inbox**, NULL))) as nextTask FROM Account
实际上,IFNULL 的字符串大约有 10 个,每个都是相当复杂的子查询。
我想知道如果第一个满足,MySQL 是否会计算以下 IFNULL 表达式的值。也就是说,如果一个帐户应该发送一条消息,它不应该费心计算应该检查收件箱的子查询
这是 MySQL 的工作原理吗?
这和 CASE WHEN's 有什么区别
例如
CASE WHEN **Should send message** THEN **Should send message**
WHEN **Should check inbox** THEN **Should check inbox**
END
我只想降低此查询的 CPU 使用率。
解决方案
你正在尝试的最好是使用COALESCE(value,...)
返回列表中的第一个非 NULL 值,如果没有非 NULL 值,则返回 NULL。
所以它会是:
SELECT
Account.id,
COALESCE(
**Should send message query**,
**Should check inbox**
) as nextTask
FROM Account
现在到你的实际问题
我想知道如果第一个满足,MySQL 是否会计算以下 [IFNULL] 表达式的值。
引擎没有理由这样做。您可以使用以下脚本对其进行测试:
set @executed1 = 'no';
set @executed2 = 'no';
select coalesce(
@executed1 := 'yes', -- evaluates to non null
@executed2 := 'yes'
);
select @executed1, @executed2;
结果:
@executed1 | @executed2
yes | no
如您所见,第二个表达式未执行,因为第一个表达式已被评估为非 NULL 值。
set @executed1 = 'no';
set @executed2 = 'no';
select coalesce(
nullif(@executed1 := 'yes', 'yes'), -- evaluates to null
@executed2 := 'yes'
);
select @executed1, @executed2;
结果:
@executed1 | @executed2
yes | yes
这里两个表达式都已执行,因为第一个表达式已被评估为 NULL。
我会说 - 对于IFNULL
. 但我不会使用它。至少在你的情况下不是。
推荐阅读
- python - 如何通过 python 将雪花与 Oauth 连接起来?
- ios - 如何使用 oauth_body_hash 属性在 Swift 中发送 OAuth 1.0 请求
- python-3.x - 如何使用 python-telegram-bot 广播自定义消息
- python - Pandas 在使用 read_csv 时会截断列宽
- react-native - React native 将帖子分享到其他应用程序,例如在什么应用程序中作为链接,并在用户单击该链接时在应用程序中打开该项目
- python - 如何将数据传递给 django 中的序列化程序
- python - 如何将输入转换为带间隔的范围?
- java - 使用秋千设置 3x3 网格布局
- microservices - 单个数据库表只能由单个微服务表示,这是微服务的基本规则吗?
- python - 将复杂逻辑表达式转换为 CNF(无指数爆炸)