为什么在加入条件时我的 SQL 请求要慢得多?

Why is my SQL request much slower when the condition is in the join?

我有一个 table 包含以下列:

  1. ID
  2. 大师ID

Master ID 可以在具有不同 ID 的不同行之间共享。

例如:

ID | Master ID
1  |  1
2  |  1
3  |  1
4  |  2

知道 ID 我想检索共享相同主 ID 的所有行

我使用这个查询设法做到了:

Select * 
FROM table t
LEFT JOIN table t2
ON t.MASTER_ID = t2.MASTER_ID 
Where t.ID = '1'

然后我也尝试使用:

Select * 
FROM table t
LEFT JOIN table t2
ON t.MASTER_ID = t2.MASTER_ID and t.ID = '1'

那样的话,就慢多了。谁能解释一下为什么?

您不应在 JOIN ON 条件中包含 t.ID = '1',因为它不是合并的 table。 FROM 部分中 table 的条件应保留在 WHERE 子句中;而 condition 属于 joined table 应该移动到 join on 子句以便获得适当的外部连接效果而不是内部连接效果。

查询正在做不同的事情,第一个你说的是:

1. give me all rows from `table` where `id = 1`
2. Also give me rows from t2 with a matching master ID

在你说的那一秒

1. Give me all rows from `table`
2. Return rows from `t2` with a matching master ID and where `t1.ID = 1`

在一个简单的例子中你可能有

ID  Master_ID
------------------------
1   1
2   1
3   1
4   2

因此您的第一个查询将 return:

t1.ID   t1.Master_ID    t2.ID   t2.Master_ID
--------------------------------------------
1           1           1       1
1           1           2       1
1           1           3       1

您的第二个查询将 return

t1.ID   t1.Master_ID    t2.ID   t2.Master_ID
--------------------------------------------
1           1           1       1
1           1           2       1
1           1           3       1
2           1           NULL    NULL
3           1           NULL    NULL
4           2           NULL    NULL

所以基本上在第一个查询中你 return 从你的 table 中获取有限数量的行,而在第二个查询中你 return 所有行,但只加入一些其中

如果 t.ID = '1' 条件在 WHERE 子句中,则 t.ID='1' 条件只需要计算 t 中的行数。如果将 t.ID='1' 条件放入连接的 ON 子句中,则必须对 t2 中的所有行进行评估。如果 t2 中有很多行,这会显着增加查询的 运行 时间。

不需要 OUTER JOIN。原因很简单,您在同一列上加入了相同的 table - 不可能不匹配!

因此要使用的查询是

 Select * 
 FROM T
 INNER  JOIN T t2    
 ON T.MasterID = t2.MasterID 
 Where t.ID = 1