0

インデックスに関する私の基本的な理解では、インデックスはWHERE句の列で使用されます。句はステートメントの後に適用される句HAVINGに似ているため、インデックスはそれに対して同じ効果がありますか? 例えば:WHEREGROUP 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

この 2 番目のクエリでは、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 は最後に適用されるため、行はディスクからロードされ、HAVING 基準に一致しない場合は破棄される可能性があります。

于 2012-06-10T18:08:25.953 に答える