我有多个连接,包括 mysql 中的左连接。有两种方法可以做到这一点。
哪种方式更好?
如果我在查询中需要 Left join 或 Right join 有什么不同吗?
最佳答案
对于简单的使用,MySQL 几乎不可避免地会以相同的方式执行它们,因此它是一种偏好和可读性的方式(这是一个很大的争论话题)。
然而,对于更复杂的查询,尤其是带有 OUTER JOIN
的聚合查询,这些查询有可能成为磁盘和 io 绑定(bind)的 - 不将 WHERE 子句与 OUTER JOIN 查询一起使用可能会产生性能和看不见的影响。
运行 8 分钟或 0.8 秒 的查询之间的差异可能 最终取决于 WHERE
子句,特别是因为它与索引 ( How MySQL uses Indexes ) 相关: WHERE
子句是向查询优化器提供它的信息的核心部分需要完成它的工作并告诉引擎如何以最有效的方式执行查询。
来自 How MySQL Optimizes Queries using WHERE :
一些例子:
全表扫描(类型 = ALL),在 EXTRA 中没有 Using where
[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id AND cr.role = cr2.role AND cr.util = 1000
[Err] Out of memory
使用
where
优化结果,索引( Using where
, Using index
) :[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id
WHERE cr.role = cr2.role
AND cr.util = 1000
515661 rows in set (0.124s)
****组合 ON/WHERE - 相同的结果 -
EXPLAIN
中的相同计划 *******[SQL] SELECT cr.id,cr2.role FROM CReportsAL cr
LEFT JOIN CReportsCA cr2
ON cr.id = cr2.id
AND cr.role = cr2.role
WHERE cr.util = 1000
515661 rows in set (0.121s)
MySQL 通常足够聪明,可以找出像上面这样的简单查询,并且会以类似的方式执行它们,但在某些情况下它不会。
外连接查询性能:
由于LEFT JOIN 和RIGHT JOIN 都是OUTER JOINS(Great in depth review here) 笛卡尔积的问题,必须避免避免Table Scans,以便尽可能快地消除查询不需要的尽可能多的行。
WHERE
、索引和查询优化器一起使用 可以 在与 AVERAGE
、 GROUP BY
、 SUM
、 DISTINCT
等聚合函数一起使用时,可以完全消除笛卡尔积带来的问题。通过适当的索引实现运行时间的数量级减少WHERE 子句的用户和使用情况。最后
同样,对于大多数查询,查询优化器将以相同的方式执行这些 - 使其成为一种偏好方式,但是当查询优化变得重要时,
WHERE
是一个非常重要的工具。通过将索引 col 指定为额外的 ON..AND ON 子句,我已经看到在 INNER JOIN
的某些情况下性能有所提高,但我无法告诉您原因。关于mysql - 将 'on' 条件放在多个连接中哪个更好? (mysql),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18168910/