0

在我对索引的基本理解中,索引用于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性能(不管 a HAVING)?

4

1 回答 1

6

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

从本质上讲,一个HAVING子句可以被视为应用另一个查询,将您的主查询变成子查询。

例如

SELECT ...
FROM sometable
HAVING somefield = X

真的没有什么不同

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

如果您使用 HAVING 过滤的字段不是派生字段(聚合值、计算字段等),那么您几乎肯定最好在 WHERE 级别进行过滤,这样可以防止加载不必要的行首先从磁盘上。

由于最后应用了,因此将从磁盘加载行,如果它们不符合 HAVING 标准,则可能会被丢弃。

于 2012-06-10T18:08:25.953 回答