1

你好 :) 我有一个关于 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'
4

2 回答 2

1

正如西蒙所指出的,性能差异应该可以忽略不计。主要关注的是确保您的查询正确表达您的意图,并且(尤其是)您获得预期的结果。

通常,只有当过滤器是join 的条件时,您才希望将过滤器添加到 JOIN 子句。在大多数(不是所有)情况下,应将过滤器应用于 WHERE 子句,因为它是整个查询的过滤器,而不是连接本身的过滤器。

AFAIK,唯一真正影响查询结果的实例是使用 OUTER JOIN 时。

考虑以下查询:

SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE o.OrderType = "InternetOrder"

对比

SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId AND o.OrderType = "InternetOrder"

第一个将为每个订单类型为“Internet Order”的客户订单返回一行。实际上,由于应用于整个查询的过滤器,您的左连接已成为内连接(即根本不会返回没有“InternetOrder”的客户)。

第二个将为每个客户返回至少一行。如果客户没有订单类型为“Internet Order”的订单,它将为所有订单表字段返回空值。否则,它将为每个“互联网订单”类型的客户订单返回一行。

于 2013-10-25T15:57:20.840 回答
0

如果约束基于连接表(如您的),那么在连接时指定约束是有意义的。

这样,MySQL 能够在连接时减少连接表中的行,否则它需要能够在应用 WHERE 逻辑之前选择满足基本 JOIN 标准的所有数据。

实际上,在您获得更复杂的查询或更大的数据集之前,您会发现性能几乎没有差异,但是如果做得好,特别是如果连接表上有良好的索引,则限制每个 JOIN 处的数据总体上会更有效。

于 2013-10-25T14:07:37.787 回答