鉴于下面的查询
SELECT * FROM tableA
LEFT JOIN tableB ON tableB.id = tableA.id
WHERE tableA.name = 'e'
Run Code Online (Sandbox Code Playgroud)
.
tableA tableB
----------- -----------
id name id school
----------- -----------
1 a 1 AA
2 b 2 BB
3 c 3 CC
4 d 4 DD
5 e 5 EE
Run Code Online (Sandbox Code Playgroud)
.
令我困惑的是背后发生的过程。
在仅从 WHERE 子句中选择行之前,系统是否首先对 tableA 和 tableB 进行 JOIN?
如果是,那么这个查询呢
SELECT * FROM
(
SELECT * FROM tableA
WHERE name = 'e'
) A LEFT JOIN tableB ON tableB.id = A.id
Run Code Online (Sandbox Code Playgroud)
此查询在连接另一个表之前是否先使用 WHERE 子句进行选择?
抱歉,我在网上找不到答案。我想减少 MySQL 资源带宽。第二个查询是否最适合这种情况?
查询优化器会做出决定,它非常聪明。
SELECT * FROM tableA
LEFT JOIN tableB
ON tableB.id = tableA.id
WHERE tableA.name = 'e'
Run Code Online (Sandbox Code Playgroud)
在很多情况下,先进行连接会更有效。如果 name 已编入索引并且 'e' 有点独特,那么首先这样做会更有效率。
这是不同的
SELECT * FROM tableA
LEFT JOIN tableB
ON tableB.id = tableA.id
WHERE tableB.school = 'EE'
Run Code Online (Sandbox Code Playgroud)
这会将左连接更改为内连接,但由于您的数据中存在匹配项,因此您将获得相同的结果。
归档时间: |
|
查看次数: |
23845 次 |
最近记录: |