为什么在加入条件时我的 SQL 请求要慢得多?
Why is my SQL request much slower when the condition is in the join?
我有一个 table 包含以下列:
- ID
- 大师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
我有一个 table 包含以下列:
- ID
- 大师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