【问题标题】:Multiple Table Select vs. JOIN (performance)多表选择与 JOIN(性能)
【发布时间】:2012-11-08 16:29:16
【问题描述】:

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

【问题讨论】:

  • 总是使用第二个,这是现代的做法!
  • 体面的 DBMS 应该有一个查询优化器,可以消化输入查询并找出运行它的最佳方式。所以查询优化器应该平等地处理你提到的查询。
  • 在我的 Oracle SQL Developer 3.1.06 设置中,“从 t1、t2、t3 where 中选择”比使用“从 t1 内连接 t2 上选择...”的等效项快 0,016 秒:0,094 秒对 0,109 秒。尽管答案指出,可读性有所下降。

标签: mysql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    它也可以在需要时轻松替换为 OUTER JOIN 出现。

    WHERE 语法更面向关系模型。

    两个表 JOIN'ed 的结果是表的笛卡尔积 应用了一个过滤器,它只选择那些加入的行 列匹配。

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

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

    还要注意 MySQL 也有一个 STRAIGHT_JOIN 子句。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 2015-09-21
      • 2013-01-25
      • 2014-02-11
      • 2010-09-27
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多