質問: table 内の name の重複を確認し、表示したいと下記の sql を実行しました。 ``` SELECT * FROM XXXX WHERE unique_id IN ( SELECT unique_id FROM XXXX GROUP BY name HAVING COUNT(name)!=1 ) ``` `unique_id` UNIQUE INDEX, VARCHAR(50) `name` VARCHAR(255) マルチバイト文字列 上記 sql でいつまでたっても処理が完了しません。 *エラー等は出ていません。 以下はきちんと意図した unique_id が返ってきており、 ``` sql-1 SELECT unique_id FROM XXXX GROUP BY name HAVING COUNT(name)!=1 ``` 以下も対象となるデータが返ってきます。 ``` sql-2 SELECT * FROM XXXX WHERE unique_id IN ( 'hogehoge','fugafuga' ) ``` 単純に時間がかかっているだけでしょうか? 原因がわかると非常に助かります。 よろしくお願いいたします。 追記 -- レコード数は5万程度、重複は数百件です。 また、 sql-1 : 0.296 sec sql-2 : 0.015 sec 程度で返ってきています。
回答: MySQLの場合、相関関係がなさそうなサブクエリも相関サブクエリとなってしまうことがあって、両テーブルの掛け算で時間がかかるという災難が訪れることがあります(`EXPLAIN`で確認すると、状況がわかるかもしれません)。 `unique_id`を抽出したテーブルと、元のテーブルを`JOIN`してみてはどうでしょうか(以下のは試しに書いてみただけで、間違っているかもしれません)。 ``` SELECT original.* FROM XXXX AS original INNER JOIN (SELECT unique_id FROM XXXX GROUP BY name HAVING COUNT(name)!=1) AS not_unique ON original.unique_id = not_unique.unique_id ```