データベースに検査したい重複がいくつかあるので、どれが重複しているかを確認するために行ったことは、次のとおりです。
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
このようにして、relevant_field が複数回発生するすべての行を取得します。このクエリの実行には数ミリ秒かかります。
ここで、各重複を検査したかったので、上記のクエリで related_field を使用して some_table の各行を SELECT できると考えたので、次のようにしました。
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
これは、何らかの理由で非常に遅いことが判明しました (数分かかります)。それを遅くするためにここで何が起こっているのでしょうか?related_field は索引付けされています。
最終的に、最初のクエリからビュー「temp_view」を作成してから(SELECT relevant_field FROM some_table GROUP BY relevant_field HAVING COUNT(*) > 1)
、2番目のクエリを次のように作成してみました。
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
そして、それはうまく機能します。MySQL はこれを数ミリ秒で実行します。
何が起こっているのか説明できる SQL 専門家はいますか?