質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

4481閲覧

WHERE IN 文で結果が返ってこない

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/07/12 04:00

編集2016/07/12 04:12

table 内の name の重複を確認し、表示したいと下記の sql を実行しました。

sql

1SELECT * 2FROM XXXX 3WHERE unique_id IN ( 4SELECT unique_id 5FROM XXXX 6GROUP BY name HAVING COUNT(name)!=1 7)

unique_id UNIQUE INDEX, VARCHAR(50)
name VARCHAR(255) マルチバイト文字列

上記 sql でいつまでたっても処理が完了しません。
*エラー等は出ていません。

以下はきちんと意図した unique_id が返ってきており、

sql

1sql-1 2 3SELECT unique_id 4FROM XXXX 5GROUP BY name HAVING COUNT(name)!=1

以下も対象となるデータが返ってきます。

sql

1sql-2 2 3SELECT * 4FROM XXXX 5WHERE unique_id IN ( 6'hogehoge','fugafuga' 7)

単純に時間がかかっているだけでしょうか?
原因がわかると非常に助かります。

よろしくお願いいたします。

追記

レコード数は5万程度、重複は数百件です。
また、
sql-1 : 0.296 sec
sql-2 : 0.015 sec
程度で返ってきています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

MySQLの場合、相関関係がなさそうなサブクエリも相関サブクエリとなってしまうことがあって、両テーブルの掛け算で時間がかかるという災難が訪れることがあります(EXPLAINで確認すると、状況がわかるかもしれません)。

unique_idを抽出したテーブルと、元のテーブルをJOINしてみてはどうでしょうか(以下のは試しに書いてみただけで、間違っているかもしれません)。

SQL

1SELECT original.* 2FROM XXXX AS original 3INNER JOIN 4(SELECT unique_id 5FROM XXXX 6GROUP BY name HAVING COUNT(name)!=1) AS not_unique 7ON original.unique_id = not_unique.unique_id

投稿2016/07/12 04:13

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/12 04:16

理由に関しては理解できてませんが、結果は完璧でした! 頂いた情報を確認してみます。 ありがとうございました!
退会済みユーザー

退会済みユーザー

2016/07/12 04:58

http://nippondanji.blogspot.jp/2009/03/mysql_25.html こちらの現象だったんですね。 DEPENDENT SUBQUERY となっておりました。 インデックスで改善されると記述があったのですが、今回の件では改善されなかったので、サブクエリの使用は断念しようと思います。 現行の MySQL では、JOIN がオススメなのですね。
guest

0

unique_idはINTですか?VARCHARですか?それともTEXTですか?unique_idにINDEXは貼ってありますか?
WHERE条件にTEXTのカラムを使うことや、INDEXの貼られていないカラムを使うと、レコード数が多ければ多いほど時間を食うようになります。

###追記
すみません、めっちゃ書いてありましたね…これらは当てはまらないかもしれません。

投稿2016/07/12 04:05

編集2016/07/12 04:07
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/12 04:08

質問文にも書きましたが、unique_id UNIQUE INDEX, VARCHAR(50) です。 レコード数は5万件程度、重複は数百件です。
退会済みユーザー

退会済みユーザー

2016/07/12 04:13

いえ、正直sql文に関しては素人なので、どのようなアドバイスも助かります。 気になった点があれば教えて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問