根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果
Posted
技术标签:
【中文标题】根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果【英文标题】:Limiting SQL results based on JOIN ON parameter(s) or WHERE parameter(s) 【发布时间】: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 - 解释执行计划是相同的 - 基于结果,我确实认为它们是相同的,但想知道是否有任何后端内容根据查询的布局方式发生变化
如果执行计划相同,则执行相同的工作。
【参考方案1】:
只要没有外连接,结果集就没有区别。 并且所有并非完全愚蠢的优化器都会对这两个版本一视同仁。
【讨论】:
【参考方案2】:两个查询将提供相同的性能,并将在相同的时间内执行。两者的执行计划相同
V1 执行计划
V2 执行计划
【讨论】:
有趣的软件——如果你不介意我问,它是什么? SQL Server 管理工作室。 它的 sql server 管理工作室 (SSMS)。您有一个名为 include execution plan 的选项,它有助于为您的查询生成执行计划,您可以使用它优化查询性能。以上是关于根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果的主要内容,如果未能解决你的问题,请参考以下文章
mysql的inner join,left jion,right join,cross join以及on和where的区别
`INNER JOIN` 过滤条件在查询中的位置; `ON` 或 `WHERE` 子句 [关闭]