ここで2つの質問があります。最初の質問に対する答えは「はい」です。HAVING
-ladenクエリの結果セットは、サブクエリとして実行された同じクエリの結果セットと同じであり、WHERE
句で装飾されています。
2番目の質問は、パフォーマンスと表現度についてです。ここでは、実装について詳しく説明します。MySQLには細い赤い線があり、パフォーマンスがバラバラになり始めます。内部クエリの結果セットをメモリに保持できなくなった瞬間。この場合、MySQLは内部クエリのディスク上表現を作成し、その上でWHERE
セレクターを使用します。これは発生しません。HAVING
句が使用されている場合、失格となったグループは結果セットから削除されます。
これは、HAVING
句の選択性が高いほど、パフォーマンスの関連性が高くなることを意味します。内部クエリの100万行の結果セットを検討します。これは、HAVING
句によって5行に削減されます。結果セットは非常に可能性が高いです。内部クエリのはメモリに保持されませんが、最終的な結果セットが保持される可能性が非常に高くなります。
編集
私はこれを一度持っていました:クエリは非常に均等に分散されたテーブルからいくつかの外れ値を選択しました(1日あたりのワークショップで物理マシンで生成されたピースの数)。IO負荷が高いため調査しました。
編集2
クエリキャッシュはサブクエリには使用されないことに注意してください-私見では、場所の開発はもっと焦点を当てる必要があります-サブクエリパターンは、キャッシュされた結果セットである内部クエリから利益を得ることはありません。