gpt4 book ai didi

mysql - MySQL 中计算列的 HAVING 与 WHERE 性能

转载 作者:行者123 更新时间:2023-11-29 09:41:03 24 4
gpt4 key购买 nike

我正在尝试使用 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 次平均评分,这可能超过了任何好处。除非它足够聪明,每行只计算一次?有人可以解释一下吗?

谢谢。

最佳答案

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

带有计算功能的 WHERE 也无法使用索引,因此它仍然需要像 HAVING 版本那样检查整个表,但它只会收集符合条件的行。

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

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

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

关于mysql - MySQL 中计算列的 HAVING 与 WHERE 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56604780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com