2011-06-20 1 views
3

私はデータベースのものと相互参照し、それらの間にあるものをフィルタリングする必要があるIDの束(外部ソースから)を与えられます特定の日付と、また「有効にされている」などのパラメータがあります。MySQLでIN()に渡される項目の最大数は何ですか

SELECT * FROM `table` WHERE `id` IN (csv_list_of_external_ids) 
    AND (my other cross-reference parameters); 

これを行うことで、すべての着信IDのうち、私が望むものを得ることができます。しかし、明らかに、これは、外部IDが数千にある場合、非常に効率的な方法ではありません。 MySQLがこのような膨大なクエリをサポートするかどうかは不明です。

(ユーザーデータと外部IDの両方がすべてのクエリでかなり変更されるため)何もキャッシュできないことと、これらのクエリが少なくとも10秒ごとに発生することを考えれば、他にどのようなSQLの選択肢がありますか?

答えて

3

実際のクエリの長​​さは、my.cnfファイルの "max_allowed_pa​​cket"パラメータによって制御されます。

+0

問題は、私はそのパラメータを制御できないということです。 – Julian

+1

次に、クエリが設定されている制限よりも短くなるようにする必要があります。その1つの方法は、複数のINSERT文を使用してIN()句のすべての値をテンポラリ・テーブルに挿入し、クエリでサブ・セレクトを使用することです。WHERE 'id' IN(SELECT id FROM temp_table) – Flimzy

+0

一時テーブルでは、MEMORYをテーブルのエンジンとして使用していますか? – Julian

0

あなたがサブクエリとしてそれを表現した場合:

SELECT * FROM table 
WHERE id IN (SELECT ID FROM SOME_OTHER_TABLE) 
AND ... 

制限はありません。

+0

私の問題は、サブクエリのIDが文字列として外部ソースから渡されたことです(別のプロバイダからのAPIコールです) – Julian

関連する問題