首页 > 解决方案 > 在 SQL JOINS 中定义右表和左表

问题描述

我想问有没有办法知道在 SQL 中使用连接时哪个表应该在右边或左边?例如,我有两个要加入的表,例如,

SELECT * FROM filtered_numbers LEFT JOIN telecoms ON filtered_numbers.TelecomID = telecoms.ID

现在“filtered_numbers”表有 200 条记录,而“电信”只有 5 条记录。我的问题是,如果我在查询中交换这两个表的位置,数据库的性能/效率会有所不同吗?如果是,为什么?

标签: mysqlsqljoin

解决方案


这个答案有点复杂。首先要注意的是

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这是更可取的。

虽然这是简化的,但并不总是如此。如果您有一个复杂的查询,JOINs的顺序可能会有所不同。现在,LEFT JOIN有一个“驱动”表(保留所有行),因此选项更少。但是,如果您有INNER JOINs,那么订购可能很重要。

事实上,MySQL 提供优化器提示只是为了控制连接顺序非常重要。

所以,你的问题的答案是:

  • 切换查询中的表会影响性能,因为查询的含义会发生变化。
  • 切换表并更改为 aRIGHT JOIN不会影响性能,因为优化器实际上只有一个选项。
  • 在更复杂的查询中,连接的顺序可能很重要。

推荐阅读