Mysql 多表选择与联接(性能)

Mysql 多表选择与联接(性能),mysql,Mysql,在MySQL中从多个表中进行选择时,以下两个查询都返回相同的结果集 这些查询中的一个比另一个更好还是更高效?根据我对一个小数据集(每个表中约2k行)的测试,它们都在大约相同的执行时间内返回相同的结果集 查询1: SELECT * FROM products, product_meta, sales_rights WHERE ( products.id = product_meta.product_id AND produc

在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;
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:

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;
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;

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

    • 我认为这是一个很好的解释

      内部联接是您应该使用的ANSI语法

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

      它也可以在需要时轻松地替换为外部连接 出现

      WHERE语法更面向关系模型

      两个表连接的结果是要连接的表的笛卡尔积 应用了一个过滤器,该过滤器仅选择具有连接的行 列匹配

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

      对于您的示例,在MySQL中(以及在SQL中),这两个查询 是同义词

      还要注意,MySQL还有一个STREAT_JOIN子句

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

      您无法在MySQL中使用WHERE语法来控制这一点


      始终使用第二种,这是现代的做法!体面的DBMS应该有一个查询优化器,它可以消化输入查询并找出运行它的最佳方式。因此,查询优化器应该同样处理您提到的查询。在我的设置Oracle SQL Developer 3.1.06中,“从t1、t2、t3中选择”,比“从t1中选择内部连接t2打开…”的等效查询快0016s:0094s vs 0109s。尽管正如答案所指出的那样,可读性有所下降。