1. ホーム
  2. sql

MySQL "in 節" 内のアイテム数

2023-10-30 07:38:36

質問内容

ユーザーを定義するために3つのテーブルを持っています。

USER: user_id (int), username (varchar)
USER_METADATA_FIELD: user_metadata_field_id (int), field_name (varchar)
USER_METADATA: user_metadata_field_id (int), user_id (int), field_value (varchar)

アプリケーション内の他のユーザーに対して特定のアクセスを持つ中間層のユーザーを作りたいと思います。ログインしているユーザーがアクセスできるユーザーを決定するために、私は以下のようなサブクエリーを使用しています。

SELECT user_id FROM user WHERE user_id 
     IN (SELECT user_id 
         FROM user_metadata 
         WHERE user_metadata_field_id = 1 AND field_value = 'foo')

現在、私はサブクエリの文字列を変数に格納し、ユーザーのリストを取得する必要があるたびに、それを外部クエリに動的に挿入しています。これを実行した後、私は次のように考えました。 user_id s" の文字列を保存する方がよいはずです。

では、これを変数に格納する代わりに...

$subSql = "SELECT user_id FROM user_metadata WHERE user_metadata_field_id = 1 AND field_value = 'foo'";

... 実際にクエリを実行し、その結果をこのように保存します...

$subSql = "12, 56, 89, 100, 1234, 890";

そして、ログインしているユーザーがアクセスできるユーザーのリストを引き出す必要があるとき、次のようにすることができます。

$sql = "SELECT user_id FROM user WHERE user_id IN ($subSql)";

そして最後に質問です。

MySQL で使用できるアイテムの数 IN CLAUSE で使用できるアイテムの数は?サブSQLステートメントの代わりに実際のIDを保存することは、毎回外側のクエリを実行するために速くなければなりませんね?

どのように解決するのですか?

ある数字から始まって IN テーブルが速くなります。

MySQL には、多数の定数値にわたって範囲を構築することが、ネストされたループで同じことをするよりも遅くなるようなコード内部の何かがあります。

パフォーマンスの詳細については、私のブログのこの記事を参照してください。