我正在两种不同的方式使用WHERE或HAVING来查询我的MySQL database。查询看起来像这样(它们是根据用户输入动态形成的):

SELECT * 
FROM books 
WHERE books.ratings_sum/books.ratings_count > 2 
AND books.ratings_sum/books.ratings_count < 4 
ORDER BY books.ratings_sum/books.ratings_count DESC;
SELECT *, books.ratings_sum/books.ratings_count as avg_rating 
FROM books 
HAVING avg_rating > 0 
ORDER BY avg_rating DESC;

我想知道哪个会更高效。我知道HAVING只应用了很少的优化,因为它在查询已经返回行后过滤结果,因此WHERE会有优势。但WHERE条款似乎计算每行3次的平均评级,可能超过任何好处。除非它足够智能,每行只计算一次?有人可以对此有所了解吗?

谢谢。

分析解答

如果有任何差异,HAVING版本可能会变慢。它将忽略您拥有的任何索引,在收集表中包含的所有数据后过滤结果。

计算中的任何一个也无法使用索引,因此它仍然必须像HAVING版本那样检查整个表,但它只会收集符合条件的行。

与读取数据相比,使用的简单数学运算非常便宜。

粗略/潜在地说......  The HAVING版本必须读取每一行的每个字段。 The WHERE版本必须读取每行的ratings_sumratings_count字段,但只有其他字段才能满足这些字段的条件。

....这是假设查询优化器内部没有 re-interpret 它们到同一个计划(假设你在两者上使用相同的条件,不像问题中提供的版本)。