クエリを入力すると:
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3 and A.T4 = B.T4
mysql がハングします。ただし、制約の 1 つを取り除くと、次のようになります。
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3
mysql はほとんどすぐに結果を返します。どうしてこれなの?
クエリを入力すると:
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3 and A.T4 = B.T4
mysql がハングします。ただし、制約の 1 つを取り除くと、次のようになります。
SELECT A.T1, B.T2, from A, B where A.T3 = B.T3
mysql はほとんどすぐに結果を返します。どうしてこれなの?
あなたはこれを非常に遅く非効率的な方法で行っています。AND 句自体とは関係ありませんが、テーブルの設計方法とクエリの実行方法が関係しています。
次の行に沿って何かを試してください。
SELECT A.T1, B.T2
FROM A
JOIN B ON B.T3 = A.T3 AND A.T4 = B.T4
また、パフォーマンスをさらに向上させるには、列が最も多いテーブルを JOIN ではなく FROM 句に配置します。
また、テーブルのセットが非常に大きいため、インデックスを作成することを検討する必要があります。
CREATE INDEX index_name
ON A (T4)
GO
CREATE INDEX index_name2
ON B (T4)
GO
インデックスを作成する必要があるのは 1 回だけです。クエリを実行するたびにこれを行う必要はありません。 通常、インデックスを作成したら、それについて再度心配する必要はありません。
インデックス作成の詳細: http://en.wikipedia.org/wiki/Database_index
ほとんどの場合、これは制約自体には関係なく、制約とインデックスの関係に関係しています。テーブルに定義されたインデックスに関する WHERE 句を見てください。WHERE 句の順序によっても違いが生じることがあります。
可能であれば、SQL-1 型の JOIN から離れて、より見やすく柔軟な SQL-2 型に移行してみてください。マッドバーンの答えを見てください。