次のクエリがあるとします。
SELECT * FROM table1 WHERE table1.id IN (1, 2, 3, 4, 5, ..., 999999)
IN
条項の項目数の妥当な最大値はいくつですか?Sphinxを使用して全文検索結果を生成し、MySQLクエリにIDを挿入しています。これはそれを行うための許容できる方法ですか?
次のクエリがあるとします。
SELECT * FROM table1 WHERE table1.id IN (1, 2, 3, 4, 5, ..., 999999)
IN
条項の項目数の妥当な最大値はいくつですか?Sphinxを使用して全文検索結果を生成し、MySQLクエリにIDを挿入しています。これはそれを行うための許容できる方法ですか?
IN句に次のようなクエリの結果を取得させることもできます。
SELECT * FROM table1
WHERE table1.id IN
(
SELECT id from table2
)
そうすれば、可能なすべての値を含むテキスト文字列を生成する必要はありません。
mysqlでは、「max_allowed_packet」の値によってのみ制約される、必要な数の値をIN句に入れることができるはずです。
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html #sysvar_max_allowed_packet
このトピックの複製のようです: https ://stackoverflow.com/a/4275704/838712
提供された回答では、仕様に公式の制限がないことは明らかですが、DBMSの構成によって異なります。
MariaDB(私の場合は10.3.22)では、マテリアライズド一時テーブルを作成する前にIN()に999パラメーターの制限があり、実行時間が大幅に長くなる可能性があります。インデックスによって異なります。私はこの振る舞いを制御する方法を見つけていません。MySQL 5.6.27にはこの制限がなく、少なくとも最大1000個のパラメーターがあります。MySQL5.7は同じ「機能」を持っている可能性があります。
一連のを実行することになりましたwhere id = a or id = b ...
が、一連のを使用しても正常に機能しwhere id in(a, b) or id in(c, d) ...
ます。
私の経験から、最大値は句IN ('1',....,'1000')
の1000の値であり、Excelシートに1300の値があり、それらをすべてINに入れ、MySQLは1000のみを返します。