3

如果我有类似的查询

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(bA)”的值还是只评估一次?

我感兴趣的是是否有性能改进的空间。

谢谢!

更新

好的,让我们继续看一个真实世界的例子:我想计算用户喜欢与最大用户喜欢的比例值。

仅读取 users.likes 最大值(已编入索引)的查询需要 0.0003

SELECT MAX(likes) 
FROM users

所以我现在知道 max-user-likes 的值,假设它是 10000,所以我可以像这样查询需要 0.0007 秒:

SELECT (users.likes/10000) AS weight 
FROM posts
INNER JOIN users ON posts.author_id = users.id 

因此,人们希望将两个查询加在一起为 0.0003 + 0.0007 秒,但需要 0.3 秒:

SELECT (users.likes/(SELECT MAX(likes) FROM users)) AS weight 
FROM posts
INNER JOIN users ON posts.author_id = users.id 

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

4

2 回答 2

3

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

当您有一个GROUP BY子句时,MAX(b.A)将对每个group进行评估。

于 2013-03-07T08:58:38.070 回答
1

通常,对聚合函数中的表达式求值并检查每一行是否为 NULL。在遍历索引的情况下当然可以进行优化MIN,但我对此表示怀疑。MAX

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

于 2013-03-07T10:21:50.820 回答