关于HAVING的指数?

时间:2012-06-10 18:03:46

标签: mysql sql

在我对索引的基本理解中,索引用于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)?

1 个答案:

答案 0 :(得分:6)

HAVING子句基本上是在将查询结果发送到客户端之前过滤的最后一件事。只有当你需要过滤聚合函数的结果时它才有用,聚合函数的值在WHERE子句的行级过滤期间不可用。

基本上,HAVING子句可以看作是应用另一个查询,将主查询转换为子查询。

e.g。

SELECT ...
FROM sometable
HAVING somefield = X

真的没什么不同

SELECT *
FROM (
   SELECT ...
   FROM sometable
)
WHERE somefield = X

如果您使用HAVING过滤的字段派生字段(汇总值,计算字段等等),那么您几乎肯定会更好地进行过滤等级,它可以防止不必要的行首先从磁盘上加载。

由于最后一次应用,所以行将从磁盘加载,如果它们与HAVING标准不匹配则可能被丢弃。