MySQL最大值 - 时间和频率

时间:2013-03-07 08:48:32

标签: mysql performance max

如果我有像

这样的查询
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 

所以我的数据库似乎还有问题 - 有什么建议吗?

2 个答案:

答案 0 :(得分:3)

由于您没有GROUP BY子句,因此结果只有一行,您无法知道a.A的值来自哪一行。 MAX(b.A)的值只会评估一次。

如果您有GROUP BY条款,则会为每个评估MAX(b.A)

答案 1 :(得分:1)

通常,会计算聚合函数中的表达式,并检查每行的NULL。如果在索引中行走,肯定会对MINMAX进行优化,但我对此表示怀疑。

顺便说一句,当你在一张大桌子上执行MAX(id)时,你可以轻松地检查这一点。您将看到执行时间与COUNT(id)的执行时间相同(并且可能远远超过COUNT(*),具体取决于引擎)。