0

NOTINステートメントに400000を超えるIDがあります。実行するかどうか?

$query = "
   SELECT
      *
   FROM
       table_name
   WHERE
       my_field_id NOT IN(
           34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454,
           34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454,
           34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454,
           34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454,
           34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454,
           34535345,3453451234,234242345,3465465,12234234,23435465,122343,345435,3453454
       )
";
4

3 に答える 3

1

はい、そうなります(実際にここで質問しなくても、自分で試すことができます)。SQLクエリ文字列に妥当な制限はありません。

ただし、追加するIDが多いほど、クエリが遅くなることを覚えておく必要があります。

PS:あなたが興味を持っているかもしれない唯一のmysql設定はですmax_allowed_packet。私が覚えていることから、それは特大のクエリでいくつかの問題を引き起こす可能性がある唯一のパラメータです

于 2012-07-02T05:31:12.910 に答える
0

MySQLのIN句には制限がないことを私は知っているので、必要な数のidを書き込むことができます。max_allowed_packetパフォーマンスと変数についてzerkmsに同意します。

回避策として、別のテーブル(おそらく一時的なもの)にid値のインデックスを付けてから、JOIN句を使用してこれら2つのテーブルをローニングしてみてください。

于 2012-07-02T06:56:29.253 に答える
0

ちなみに、NOTINの制限は1024文字です。副選択を使用する場合、制限はありません。メモリテーブルにIDを入力し、クエリで副選択を使用してそれらを取得し、後でメモリテーブルを削除することができます。これはさらに速いかもしれません。

于 2014-07-01T06:51:57.877 に答える