約 60,000 レコードの名前を持つテーブルに対して 10,000 の異なる特定の名前をチェックする必要があるシナリオがあります。キャッシングが関係ないと仮定すると、一般的に言えば、パフォーマンスの目的で、次のことを行う方が良いですか?
(1) クエリごとにおそらく 200 の異なる名前があるように、ミニクエリに分割しますか?
また
(2) 10,000 個の "OR" 句を含む 1 つの怪しい SQL ステートメントを記述しますか?
約 60,000 レコードの名前を持つテーブルに対して 10,000 の異なる特定の名前をチェックする必要があるシナリオがあります。キャッシングが関係ないと仮定すると、一般的に言えば、パフォーマンスの目的で、次のことを行う方が良いですか?
(1) クエリごとにおそらく 200 の異なる名前があるように、ミニクエリに分割しますか?
また
(2) 10,000 個の "OR" 句を含む 1 つの怪しい SQL ステートメントを記述しますか?
あなたは番号3を逃しました:完全に別の方法でやってください:
リストを別のテーブル/一時テーブルなどに書き込み、join
/exists
などを使用してフィルタリングします。
最初の観察事項の 1 つは、通常、RDBMS にはクエリ文字列のサイズの制限があり、非常に多くの OR で超える可能性があることです。
したがって、解決策は、ストアド プロシージャを作成してループで実行することです。
これを無視すると、(1) の場合は (2) の場合よりもデータにアクセスする回数が多くなるため、後者のほうが望ましいと言えます。
または #4 - バッチで IN() クエリを使用します。通常、約 1000 で十分に機能します。
SELECT * FROM table WHERE name IN ('str1', 'str2', 'str3', ...)
これは完全ではありませんが、一時テーブルは含まれておらず、MySQL は IN() の最適化に関して非常に優れています。