在MySQL中使用计算列获得性能与WHERE性能

时间:2019-06-14 20:29:36

标签: mysql

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

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 > 2
AND avg_rating < 4
ORDER BY avg_rating DESC;

我想知道哪个会更好。我知道,HAVING几乎没有进行任何优化,因为它在查询已经返回行之后才过滤结果,因此WHERE将具有优势。但是WHERE子句似乎为每行计算3次平均评分,可能超过了任何好处。除非它足够聪明,每行只计算一次?有人能对此有所启发吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

与读取数据相比,像所使用的那样简单的数学运算极其便宜。

粗略/潜在地讲... HAVING版本必须读取每一行的每个字段。 WHERE版本将必须读取每行的ratings_sumratings_count字段,但在满足这些字段条件的情况下,只能读取其余字段。

....这是假设查询优化器没有在内部将它们重新解释为相同的计划(并且假设您对这两者使用相同的条件,与问题中提出的版本不同)。