1. ホーム
  2. mysql

[解決済み] MySQL - SELECT WHERE field IN (サブクエリ) - 極端に遅いのはなぜ?

2022-04-27 13:51:19

質問

データベースの中に重複しているものがいくつかあるので、それを検査したいのですが、どれが重複しているか見るために、私はこのようなことをしました。

SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1

この方法で、relevant_fieldが2回以上出現するすべての行を取得します。このクエリの実行には数ミリ秒かかります。

さて、重複しているものをそれぞれ検査したいので、上記のクエリでsome_table内のrelevant_fieldがある行をそれぞれ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の専門家の方で、何が起こっているのか説明できる方はいらっしゃいますか?

解決方法は?

相関クエリであるため、各行に対してサブクエリが実行されています。このように、サブクエリからすべてを選択することで、相関クエリを非相関クエリにすることができます。

SELECT * FROM
(
    SELECT relevant_field
    FROM some_table
    GROUP BY relevant_field
    HAVING COUNT(*) > 1
) AS subquery

最終的なクエリは次のようになります。

SELECT *
FROM some_table
WHERE relevant_field IN
(
    SELECT * FROM
    (
        SELECT relevant_field
        FROM some_table
        GROUP BY relevant_field
        HAVING COUNT(*) > 1
    ) AS subquery
)