0

これが私の質問です。

オプション1:

SELECT B.some_field FROM A 
INNER JOIN B 
ON A.id = B.a_id
WHERE ((A.field1 = '1' AND  A.field2 = '2')
OR (A.field1 = '2' AND  A.field2 = '1'))

オプション 2:

$id1 = SELECT id FROM A WHERE A.field1 = '1' AND  A.field2 = '2'
$id2 = SELECT id FROM A WHERE A.field1 = '2' AND  A.field2 = '1'

SELECT B.some_field FROM B WHERE B.a_id = '$id1' OR B.a_id = '$id2'

もちろん、これは疑似コードです。$id1 と $id2 には、対応する行の A.id の値が含まれている必要があります。

性能が良いのはどっち?

私が尋ねている理由は、A には WHERE 条件に適合する行が 2 つしかないことを知っているためです。そのため、テーブルを結合すると、MySQL のオーバーヘッドが、 B の各行に対して A.これは本当に INNER JOIN の動作ですか?

より具体的に説明します。私の場合、A の主キーは (field1, field2) です。MySQL は、2 行を超える行が生成されないと結論付けるのに十分賢いWHERE ((A.field1 = '1' AND A.field2 = '2') OR (A.field1 = '2' AND A.field2 = '1'))ので、最初にこれらの行を抽出し、A の各行に対して B のすべての行のテーブルを作成しませんか?

SOで同様の質問を見つけようとしましたが、成功しませんでした。

4

2 に答える 2

1

オプション 1 の方がパフォーマンスが優れています。

あなた( field1, field2 )は主キーであるため、where句に同じものがあります。したがって、MySQL が行うことは、最初にフィルターで除外し、Table Aそこから 2 行だけを取得することです。その後の参加は非常に簡単です。

それでも疑問がある場合は、EXPLAINコマンドを使用してください。ここでコマンドを参照してくださいEXPLAIN

于 2013-05-04T14:23:29.437 に答える