10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 下载本手册 本手册摘录

8.2.1.9外部连接优化

外部联接包括左连接右连接.

MySQL实现了一个A.左连接B连接规范具体如下:

  • B设置为依赖于表A.所有的桌子A.视情况而定。

  • A.设置为依赖于所有表(除了B)用于左连接条件。

  • 这个左连接条件用于决定如何从表中检索行B. (换句话说,在哪里不使用子句。)

  • 所有标准的连接优化都会执行,但表总是在它所依赖的所有表之后读取。如果存在循环依赖,则会发生错误。

  • 所有标准哪里执行优化。

  • 如果有一排A.符合哪里子句,但中没有行B符合条件,额外的B在所有列都设置为的情况下生成行无效的.

  • 如果你使用左连接要查找某些表中不存在的行,您需要进行以下测试:列名称为空哪里部分,在哪里列名称是声明为不为空,MySQL在找到一行与左连接条件。

这个右连接实现类似于左连接与表角色相反。右连接将转换为等效的左连接,如中所述第8.2.1.10节,“外部连接简化”.

为了一个左连接,如果哪里对于生成的无效的世界其他地区左连接更改为内部联接。例如哪里如果t2.1列无效的:

选择*FROM t1 LEFT JOIN t2 ON(column1),其中t2.column2=5;

因此,将查询转换为内部联接是安全的:

从t1,t2中选择*其中t2.column2=5和t1.column1=t2.column1;

在MySQL8.0.14及更高版本中哪里由常量文字表达式产生的条件在准备过程中被删除,而不是在优化的后期阶段,此时联接已经被简化。早期移除琐碎条件允许优化器将外部连接转换为内部连接;这可以改进查询的计划,这些查询的外部联接在哪里条款,例如:

选择*从t1左连接t2开条件1哪里条件2或0=1

优化器现在在准备过程中看到0=1总是false,这使得或0=1冗余,并将其删除,留下以下内容:

选择*从t1左连接t2开条件1哪里条件2

现在,优化器可以将查询重写为内部联接,如下所示:

从t1选择*连接t2,其中条件1以及条件2

现在优化器可以使用表t2级餐桌前t1级如果这样做会产生更好的查询计划。要提供关于表连接顺序的提示,请使用优化器提示;看见第8.9.3节,“优化器提示”. 或者,使用直螺纹联接; 看见第13.2.10节,“选择语句”. 然而,直螺纹联接可能会阻止使用索引,因为它禁用了半连接转换;看见第8.2.2.1节,“使用半连接转换优化IN和EXISTS子查询谓词”.