mysql - 在 SQL JOINS 中定义右表和左表
问题描述
我想问有没有办法知道在 SQL 中使用连接时哪个表应该在右边或左边?例如,我有两个要加入的表,例如,
SELECT * FROM filtered_numbers LEFT JOIN telecoms ON filtered_numbers.TelecomID = telecoms.ID
现在“filtered_numbers”表有 200 条记录,而“电信”只有 5 条记录。我的问题是,如果我在查询中交换这两个表的位置,数据库的性能/效率会有所不同吗?如果是,为什么?
解决方案
这个答案有点复杂。首先要注意的是
FROM filtered_numbers LEFT JOIN
telecoms
ON filtered_numbers.TelecomID = telecoms.ID
在语义上与:
FROM telecoms LEFT JOIN
filtered_numbers
ON filtered_numbers.TelecomID = telecoms.ID
仅切换表会更改查询的含义。执行计划和性能会有所不同。LEFT JOIN
如果在这种情况下将 更改为 a ,您将获得相同的查询RIGHT JOIN
,但正如 Strawberry 指出的那样,LEFT JOIN
这是更可取的。
虽然这是简化的,但并不总是如此。如果您有一个复杂的查询,JOIN
s的顺序可能会有所不同。现在,LEFT JOIN
有一个“驱动”表(保留所有行),因此选项更少。但是,如果您有INNER JOIN
s,那么订购可能很重要。
事实上,MySQL 提供优化器提示只是为了控制连接顺序非常重要。
所以,你的问题的答案是:
- 切换查询中的表会影响性能,因为查询的含义会发生变化。
- 切换表并更改为 a
RIGHT JOIN
不会影响性能,因为优化器实际上只有一个选项。 - 在更复杂的查询中,连接的顺序可能很重要。
推荐阅读
- android - 如果 Unity 将在 apk 中包含代码块,如果我将它写在“UNITY_EDITOR”中
- xml -
不断返回 null,尽管显然有一个值 - python - 在 python 中列出类型的一些说明
- ajax - 批处理 AJAX 请求到 REST 端点
- java - java.net.ConnectException:连接被 eureke-server 拒绝
- c++ - 找不到.DDS 纹理的fourCC 格式
- java - 我可以在两个不同的端口上运行 weblogic 吗?
- python - 使用 keras 进行多维回归
- java - 具有多重继承的Java序列化?
- sql - 如何将多行结果集变成一行?