MySQLには
本質的に、これは、結合を使用するときに、サブクエリが最初に検出されたときに、MySQLが次のことを実行することを意味します。
SELECT code1 FROM myTable GROUP BY code1 HAVING COUNT(code1) > 1
そして、結果を一時テーブル(ルックアップを高速化するためにハッシュ化されます)に保持してから、myTable
の値ごとに保持します 一時テーブルを検索して、コードが存在するかどうかを確認します。
ただし、IN
を使用する場合は サブクエリは具体化されず、次のように書き直されます:
SELECT t1.code1, t1.code2
FROM myTable t1
WHERE EXISTS
( SELECT t2.code1
FROM myTable t2
WHERE t2.Code1 = t1.Code1
GROUP BY t2.code1
HAVING COUNT(t2.code1) > 1
)
つまり、code
ごとに myTable
で 、サブクエリを再度実行します。サブクエリを数回だけ実行する方が、すべての値に対して実行して結果を一時テーブルに保存するよりも効率的であるため、外部クエリが非常に狭い場合は問題ありませんが、外部クエリが広い場合は、結果が得られます。何度も実行される内部クエリで、ここでパフォーマンスの違いが発生します。
したがって、行数については、サブクエリを最大30,000回実行する代わりに、1回実行してから、400行しかないハッシュ化された一時テーブルに対して最大30,000行を検索します。これにより、パフォーマンスが大幅に低下します。
オンラインドキュメントのこの記事 サブクエリの最適化についてさらに詳しく説明します。