検査したいデータベースに重複がいくつかあるので、どの重複を確認するために私はこれを行いました:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
このようにして、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
)
これは、何らかの理由で非常に遅いことがわかります(数分かかります)。それをそんなに遅くするためにここで正確に何が起こっているのですか?関連フィールドにはインデックスが付けられています。
最終的に、最初のクエリからビュー "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エキスパートはいますか?