みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

IN( )の中に、項目をたくさん入れたら処理が重くなってしまう

MySQLで↓このような、処理をしたいんですが
select
TABLE_A.*
from
TABLE_A
where
TABLE_A.id in
(select
TABLE_B.TABLE_A_ID
from
TABLE_B
)

このように、INの中にサブクエリを入れてるんですが、
ものすごく重くなってしまい、検索されるまでに通常の数倍かかってしまいます。
サブクエリの該当件数は30件ほどで、これからも増えて行く予定です。
サブクエリ発行部分を
in
(1,2,3…29,30)と
生書きしても、やや重く、どうやら、inの中に項目を
やたらたくさん入れると重くなるみたいです。
このようなINの項目が無数に増えても、
処理をより軽くするには、どうすればいいのでしょうか?

投稿日時 - 2007-09-14 15:59:54

QNo.3344391

困ってます

質問者が選んだベストアンサー

これはINNER JOINではだめなんですか?

select
TABLE_A.*
from
TABLE_A
INNER JOIN TABLE_B ON TABLE_B.TABLE_A_ID=TABLE_A.id

適当にインデックスを付けておけばかなり速いはずですが・・・

投稿日時 - 2007-09-14 16:35:33

お礼

回答有難うございます。
INNER JOINを利用して、作成した所
大変軽い動作で同じものを作ることができました!

投稿日時 - 2007-09-20 18:03:24

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

<tabA>
ID__fld1____fld2
1___aaa1___bbb1
2___aaa2___bbb2
3___aaa3___bbb3

<tabB>
ID__tabA_ID___fld1______fld2
1___________1___1111a___2222a
2___________2___1111b___2222b

[イミディエイト]
? DBSelect("select * from tabA where tabA.id in (select tabA_ID from tabB);")
1;aaa1;bbb1;
2;aaa2;bbb2;
? DBSelect("select tabA.* from tabA inner join tabB on tabB.tabA_id=tabA.id")
1;aaa1;bbb1;
2;aaa2;bbb2;

さて、これは Access2003 でのテストです。
問題は、MySQL が inner join をサポートしているかです。

INNER JOIN 操作:
2 つのテーブルの共通するフィールドに同じ値があった場合に、両方のテーブルのレコードを結合します。

http://dev.mysql.com/doc/refman/4.1/ja/join.html

注意:INNER JOIN 構文で join_condition を使用できるのは、MySQL 3.23.17 以降に限られます。同様に、JOIN と CROSS JOIN に関しても、MySQL 4.0.11 以降でのみ条件を指定できます。

投稿日時 - 2007-09-14 16:47:20

お礼

回答有難うございます。
INNER JOINを利用して、作成した所
大変軽い動作で同じものを作ることができました!

投稿日時 - 2007-09-20 18:02:37

あなたにオススメの質問