作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我对索引的基本理解中,索引用于 WHERE
子句中的列。由于 HAVING
子句类似于在 GROUP BY
语句之后应用的 WHERE
子句,索引是否具有相同的效果?例如:
SELECT * FROM table WHERE full_name = 'Bob Jones'
--> index on full_name would be beneficial here
和
SELECT * FROM table WHERE first_name = 'Bob'
GROUP BY
height HAVING height > 72
在第二个查询中,first_name 和 height 上的索引是否会提高性能?哪个指数更重要,或者它们大致相当?此外,索引是否也提高了 GROUP BY
性能(不管 HAVING
)?
最佳答案
HAVING
子句本质上是在将查询结果发送给客户端之前对查询结果进行过滤的最后一件事。它仅在您需要过滤聚合函数的结果时才有用,在 WHERE
子句执行的行级过滤期间其值不可用。
本质上,HAVING
子句可以看作是应用另一个查询,将您的主查询转换为子查询。
例如
SELECT ...
FROM sometable
HAVING somefield = X
真的没有什么不同
SELECT *
FROM (
SELECT ...
FROM sometable
)
WHERE somefield = X
如果您使用 HAVING 过滤的字段不是派生字段(聚合值、计算字段等),那么您几乎可以肯定最好在WHERE 级别,它首先防止不必要的行从磁盘加载。
由于 having 是最后应用的,行将从磁盘加载,如果它们不符合 HAVING 条件,则可能会被丢弃。
关于mysql - HAVING 上的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10971037/
我是一名优秀的程序员,十分优秀!