我正在两种不同的方式使用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_sum
和ratings_count
字段,但只有其他字段才能满足这些字段的条件。
....这是假设查询优化器内部没有 re-interpret 它们到同一个计划(假设你在两者上使用相同的条件,不像问题中提供的版本)。