[解決済み] 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
)
関連
-
MySQLのNULLについて解説した記事
-
SpringBootのMySQLへの接続は、バックエンドのインターフェイスの操作方法を書き込むためのデータを取得するために
-
MySQLの悲観的ロックと楽観的ロックの実装スキーム
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
-
SQLException。オペランドは1列でなければなりません。
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'
-
[解決済み] どのトランザクションが「テーブルメタデータのロック待ち」状態を引き起こしているかを確認するにはどうすればよいですか?
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MYSQLでMAX(列の値)、PARTITIONで別の列で行を選択するにはどうすればよいですか?
-
[解決済み] MySQL - SELECTクエリに基づくUPDATEクエリ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ジョイントインデックスのためのmysqlの条件とインデックスが失敗するための条件
-
MySQLインストールチュートリアル(Linux版
-
MySQLデータベースで数百万件のデータを10秒間で挿入
-
SQLステートメントエラーです。オペランドには 1 つのカラムを含める必要があります [括弧を追加せずに複数のフィールドをクエリする
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
MySQL 接続タイムアウト。エラー SQLSTATE[HY000] [2002] 接続がタイムアウトしました 解決済み
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
-
[解決済み] MySQLのプロセスリストを見つけ、それらのプロセスを終了させる方法は?
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] サブクエリ vs ジョイン