如果我有像
这样的查询SELECT (MAX(b.A)/a.A) AS c
FROM a
INNER JOIN b
ON a.b_id = b.id
GROUP by a.id
MySQL是为每行评估“MAX(b.A)”的值还是只评估一次?
如果有提高性能的空间,我感兴趣的是。
谢谢!
更新
好吧让我们转到一个真实世界的例子:我想计算用户喜欢的比例值与最大用户喜欢的比例。
只读取users.likes(被索引)的最大值的查询需要0.0003
SELECT MAX(likes)
FROM users
所以我现在知道max-user-likes的价值,让我们说它是10000,所以我可以这样查询,需要0.0007s:
SELECT (users.likes/10000) AS weight
FROM posts
INNER JOIN users ON posts.author_id = users.id
所以人们会期望两个查询一起成为0.0003 + 0.0007s,但需要0.3s:
SELECT (users.likes/(SELECT MAX(likes) FROM users)) AS weight
FROM posts
INNER JOIN users ON posts.author_id = users.id
所以我的数据库似乎还有问题 - 有什么建议吗?
答案 0 :(得分:3)
由于您没有GROUP BY
子句,因此结果只有一行,您无法知道a.A
的值来自哪一行。 MAX(b.A)
的值只会评估一次。
如果您有GROUP BY
条款,则会为每个组评估MAX(b.A)
。
答案 1 :(得分:1)
通常,会计算聚合函数中的表达式,并检查每行的NULL。如果在索引中行走,肯定会对MIN
和MAX
进行优化,但我对此表示怀疑。
顺便说一句,当你在一张大桌子上执行MAX(id)
时,你可以轻松地检查这一点。您将看到执行时间与COUNT(id)
的执行时间相同(并且可能远远超过COUNT(*)
,具体取决于引擎)。