MySQL を使用した IN 句内の複数の列のクエリ
構造化データを扱う場合、IN 句内の複数の列のクエリは一般的な操作です。ただし、MySQL の場合、単一タプルでの IN 句の使用とタプルのセットでの IN 句の使用には微妙な違いがあります。
単一タプル クエリ:
オリジナル質問では、地理座標を表す 4 つの列 (x0、y0、x1、y1) があるシナリオについて説明しています。 (4, 3, 5, 6) などの値の単一の組み合わせの場合、次のように IN 句を使用できます。
SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6))
(x0, y0, x1, y1 の複合インデックスを使用) )、このクエリは目的の行を効率的に見つけます。
複数のタプルクエリ:
ただし、この質問には、[(4, 3, 5, 6), (9, 3, 2, 1)] などのタプルのリストのクエリも含まれます。このようなシナリオでは、MySQL のオプティマイザーが常に IN 句を最適に処理するとは限りません。
新しい MySQL バージョンでのオプティマイザーの改善:
以前の MySQL バージョン (5.7 より前) では、オプティマイザは、提供されている説明に従って、複数のタプル クエリを一連の OR 句に分割します。回答:
( ( x0 = 4 AND y0 = 3 AND x1 = 5 AND y1 = 6 ) OR ( x0 = 9 AND y0 = 3 AND x1 = 2 AND y1 = 1 ) )
このアプローチは、特に大規模なデータセットの場合、非効率的な実行計画につながる可能性があります。
MySQL の新しいバージョン (5.7 以降) では、オプティマイザが改良され、より多くのデータセットを生成するようになりました。複数のタプル IN クエリに対する効率的な計画。これらのバージョンでは、次の構文を使用することをお勧めします:
(x0, y0, x1, y1) IN ((4, 3, 5, 6), (9, 3, 2, 1))
オプティマイザは、利用可能なインデックスを活用する最適化された実行プランを自動的に生成します。
結論:
MySQL で IN 句内の複数の列をクエリする場合、推奨されるアプローチは MySQL のバージョンによって異なります。古いバージョンの場合は、クエリを OR 句に分割することをお勧めします。新しいバージョンの場合、改良されたオプティマイザーは、手動で再構築することなく、複数のタプル IN クエリを効率的に処理できます。
以上がMySQL の IN 句を使用して複数の列を効率的にクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。