在我对索引的基本理解中,索引用于WHERE
子句中的列。由于HAVING
子句类似于在WHERE
语句之后应用的GROUP BY
子句,因此索引是否具有相同的效果?例如:
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
)?
答案 0 :(得分:6)
HAVING
子句基本上是在将查询结果发送到客户端之前过滤的最后一件事。只有当你需要过滤聚合函数的结果时它才有用,聚合函数的值在WHERE
子句的行级过滤期间不可用。
基本上,HAVING
子句可以看作是应用另一个查询,将主查询转换为子查询。
e.g。
SELECT ...
FROM sometable
HAVING somefield = X
真的没什么不同
SELECT *
FROM (
SELECT ...
FROM sometable
)
WHERE somefield = X
如果您使用HAVING过滤的字段不派生字段(汇总值,计算字段等等),那么您几乎肯定会更好地进行过滤等级,它可以防止不必要的行首先从磁盘上加载。
由于最后一次应用,所以行将从磁盘加载,如果它们与HAVING标准不匹配则可能被丢弃。