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 条件,所以我担心加入这些表会导致 MySQL 的开销超过一个由每一行组成的巨大表A 代表 B 中的每一行。这真的是 INNER JOIN 的行为方式吗?

我会更具体一点:在我的例子中,A 的主键是(field1,field2)。MySQL 是否足够聪明,可以得出结论WHERE ((A.field1 = '1' AND A.field2 = '2') OR (A.field1 = '2' AND A.field2 = '1'))不会产生超过两行,所以它会首先提取这些行,并且不会为 A 中的每一行创建 B 中所有行的表?

我试图在 SO 中找到类似的问题,但没有成功。

4

2 回答 2

1

是的,您将从表 B 中返回多行,这至少对我来说是有意义的。您要求 B.some_field 与 A 中的合格 id 匹配,其中字段为 1,2 或 2,1,如下所示: http ://sqlfiddle.com/#!2/6ff33/1

至于性能,请使用您的 Option1 因为您的主键是复合键,并且您有 1 个选择(带有连接)与 3 个使用变量的选择

于 2013-05-04T13:36:47.840 回答
1

选项 1 具有更好的性能。

由于您( field1, field2 )是主键,并且您在 where 子句中有相同的内容。所以 MySQL 会做的是,它会首先过滤掉你的内容Table A,然后你只会得到 2 行。之后加入非常简单。

如有任何疑问,请使用该EXPLAIN命令。在此处查看EXPLAIN命令

于 2013-05-04T14:23:29.437 回答