60

从 MySQL 中的多个表中进行选择时,以下两个查询都返回相同的结果集。

这些查询中的一个是否比另一个更好或更有效?从我对一个小数据集(每个表中约 2k 行)的测试来看,它们都在大约相同的执行时间内返回相同的结果集。

查询一:

SELECT
    *
FROM
    products,
    product_meta,
    sales_rights
WHERE 
    (
        products.id = product_meta.product_id
        AND products.id = sales_rights.product_id
    )
    AND (...)
LIMIT 0,10;


查询 2:

SELECT
    *
FROM
    products
INNER JOIN product_meta ON products.id = product_meta.product_id
JOIN sales_rights ON product_meta.product_id = sales_rights.product_id 
WHERE
    (...)
LIMIT 0,10;
4

2 回答 2

45

它们是相同的,但语法不同。所以你不应该期望这两种语法之间有任何性能差异。但是,建议使用最后一种语法(ANS SQL-92 语法),有关详细信息,请参阅这些:

于 2012-11-20T15:06:33.187 回答
4

我认为这个线程给出了一个很好的解释。

INNER JOIN 是您应该使用的 ANSI 语法。

它通常被认为更具可读性,尤其是当您连接大量表时。

每当需要时,它也可以很容易地用 OUTER JOIN 替换。

WHERE 语法更面向关系模型。

两个表 JOIN'ed 的结果是应用过滤器的表的笛卡尔积,该过滤器仅选择与连接列匹配的那些行。

使用 WHERE 语法更容易看到这一点。

至于您的示例,在 MySQL 中(通常在 SQL 中),这两个查询是同义词。

另请注意,MySQL 也有一个 STRAIGHT_JOIN 子句。

使用此子句,您可以控制 JOIN 顺序:在外循环中扫描哪个表,在内循环中扫描哪个表。

你不能在 MySQL 中使用 WHERE 语法来控制它。

于 2012-11-20T15:09:26.363 回答