你好:)我对MySQL查询有疑问。 哪一个更快,为什么? 是否有任何区别?
select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk
WHERE tab2.somevalue = 'value'
或者这个:
select tab1.something, tab2.smthelse
from tab1 inner join tab2 on tab1.pk=tab2.fk
AND tab2.somevalue = 'value'
答案 0 :(得分:1)
正如Simon所说,性能上的差异应该可以忽略不计。主要关注点是确保您的查询正确表达您的意图,并且(尤其)您获得预期的结果。
通常,只有在过滤器是连接的条件时才要向JOIN子句添加过滤器。在大多数(并非所有)情况下,应该将过滤器应用于WHERE子句,因为它是整个查询的过滤器,而不是连接本身的过滤器。
AFAIK,唯一真正影响查询结果的实例是使用OUTER JOIN时。
考虑以下问题:
SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE o.OrderType = "InternetOrder"
VS
SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId AND o.OrderType = "InternetOrder"
对于订单类型为“Internet订单”的每个客户订单,第一行将返回一行。实际上,由于应用于整个查询的过滤器,您的左连接已成为内连接(即,根本不会返回没有“InternetOrder”的客户。)
第二个将为每个客户返回至少一行。如果客户没有订单类型“Internet订单”,它将返回所有订单表字段的空值。否则,它将为“Internet订单”类型的每个客户订单返回一行。
答案 1 :(得分:0)
如果约束基于联接表(就像你的那样),那么在你加入时指定约束是有意义的。
这样MySQL就可以在连接时减少连接表中的行,否则它需要能够在应用WHERE逻辑之前选择满足基本JOIN条件的所有数据。
实际上,在您获得更复杂的查询或更大的数据集之前,您会发现性能上的差异很小,但是如果做得好,限制每个JOIN的数据总体上会更有效,特别是如果连接表上有好的索引。