MySQL:左外连接和内连接哪个连接更好

urs*_*ion 13 mysql performance join query-performance

如果所有连接都提供相同的结果,哪个连接性能更好?例如,我有两个表employees(emp_id,name, address, designation, age, sex)work_log(emp_id,date,hours_wored). 获得一些特定的结果inner joinleft join给出相同的结果。但是,我还有一些疑问,不仅限于这个问题。

  • 如果结果值相同,哪个连接更有效?
  • 申请加入时必须考虑的其他因素是什么?
  • 内连接和交叉连接之间有什么关系吗?

jyn*_*nus 21

没有“更好”或“更差”的连接类型。它们具有不同的含义,必须根据含义使用它们。

在你的情况,你可能不会有任何员工work_log(该表中没有行),所以LEFT JOINJOIN会在结果等同。但是,如果你有这样的事情(一个没有注册的新员工work_log),一个JOINwold 会忽略那个员工,而左连接(第一个表是员工)会显示所有这些,work_log如果没有,则字段为空火柴。

JOIN 类型的可视化说明
图片由 CL Moffatt 在代码项目中提供

同样,性能是查询正确性的次要因素。有人说你不应该使用LEFT JOINs。确实,aLEFT JOIN强制优化器以特定顺序执行查询,从而在某些情况下阻止了某些优化(表重新排序)。这是一个例子。但是如果牺牲了正确性/意义,你不应该选择一个而不是另一个,因为 anINNER JOIN本质上并不是更糟。其余的常用优化照常应用。

总而言之,LEFT JOIN如果您的意思是INNER JOIN.

在 MySQL 中CROSS JOININNER JOINJOIN是一样的。在标准和语义上, aCROSS JOININNER JOIN不带ON子句的,因此您可以获得表之间的所有行组合。

在 Wikipedia 上所有语义类型的连接示例。实际上,在 MySQL 中,我们倾向于只编写JOINLEFT JOIN.