【问题标题】:Limiting SQL results based on JOIN ON parameter(s) or WHERE parameter(s)根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果
【发布时间】:2013-09-18 17:37:51
【问题描述】:

我正在尝试确定在 MySQL 查询中的 JOIN ON 子句或 WHERE 子句本身中使用选择参数是否有任何已知的好处。

我确信并知道返回的结果是相同的,在本地测试时,“查询时间”似乎几乎可以忽略不计,但想看看是否有任何专家意见。

这两者在后端有区别吗?如果有,首选哪个?

v1

SELECT
  *
FROM users a
JOIN user_photos b ON (b.userid = a.userid)
WHERE
  a.userid = 12345
  AND b.photo_type = 1

或 v2

SELECT
  *
FROM users a
JOIN user_photos b ON (b.userid = a.userid AND b.photo_type = 1)
WHERE
  a.userid = 12345

【问题讨论】:

  • 使用EXPLAIN,看看执行计划是否不同。
  • 我认为 INNER JOIN 没有区别。会有一个 LEFT JOIN。
  • 我倾向于只在JOIN 子句中使用字段到字段的条件,其他任何内容,或者当涉及常量时,倾向于进入 WHERE 子句。使用常规的 INNER 连接,它们可能在功能上是相同的。
  • @Barmar - 解释执行计划是相同的 - 基于结果,我确实认为它们是相同的,但想知道是否有任何后端内容根据查询的布局方式发生变化
  • 如果执行计划相同,则执行相同的工作。

标签: mysql sql performance


【解决方案1】:

只要没有外连接,结果集就没有区别。 并且所有并非完全愚蠢的优化器都会对这两个版本一视同仁。

【讨论】:

    【解决方案2】:

    两个查询将提供相同的性能,并将在相同的时间内执行。两者的执行计划相同

    V1 执行计划

    V2 执行计划

    【讨论】:

    • 有趣的软件——如果你不介意我问,它是什么?
    • SQL Server 管理工作室。
    • 它的 sql server 管理工作室 (SSMS)。您有一个名为 include execution plan 的选项,它有助于为您的查询生成执行计划,您可以使用它优化查询性能。
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2020-05-07
    • 2020-03-25
    • 2012-04-28
    • 2021-03-22
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多