MySQL では、OR
で結合された 2
つの異なるキーを使用した検索は、まだ最適化されていません(1
つのキーを複数の OR
の部分で使用する検索は非常に最適化が進んでいる)。
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' OR field2_index = '1'
これは、一般的なケースでそのような検索を効率的に処理する方法を見つけだすだけの時間がないからです(一方、AND
の処理は現在では完全に一般化され、極めて効率的に動作しています)。
MySQL 4.0 以降では、2 つの異なる
SELECT
ステートメントの出力を結合する
UNION
を使用することで、この問題を効率的に解決できます。See
項6.4.1.2. 「UNION
構文」。 それぞれの
SELECT
ステートメントを使用した検索では 1
つのキーだけが使用されるので、それを最適化できます。
SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1' UNION SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
MySQL 4.0
より前のバージョンでは、TEMPORARY
テーブルおよび異なる SELECT
ステートメントを使用することで同じ効果を得られます。このような最適化は、SQL
サーバが不適切な順序で最適化を実行してしまうような、非常に複雑なクエリを実行する場合にも最適です。
CREATE TEMPORARY TABLE tmp SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'; INSERT INTO tmp SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1'; SELECT * from tmp; DROP TABLE tmp;
この解決方法は、実際には 2 つのクエリの
UNION
と同じです。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.