多表选择与JOIN(性能)

时间:2012-11-20 15:05:34

标签: mysql

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

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

查询1:

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;

2 个答案:

答案 0 :(得分:25)

它们是相同的,但语法不同。因此,您不应期望两种语法之间存在任何性能差异。但是,建议使用最后一种语法(ANS SQL-92语法),有关详细信息,请参阅以下内容:

答案 1 :(得分:1)

我认为this thread给出了很好的解释。

  

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

     

通常认为它更具可读性,尤其是在您加入时   很多桌子。

     

每当需要时,也可以使用OUTER JOIN轻松替换它   就产生了。

     

WHERE语法是面向关系模型的更多。

     

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

     

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

     

至于你的例子,在MySQL(以及一般的SQL)中这两个查询   是同义词。

     

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

     

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

     

你无法使用WHERE语法在MySQL中控制它。