mysql5.7官网直译SQL语句优化--左右连接的优化

翻译 2017年11月14日 18:37:16
1.8Left Join and Right Join Optimization(左连接和右连接的优化):
mysql执行一个A left join B的连接条件如下:
>表B是一个依赖于A和A依赖的所有其他表共同决定的集合。
>表A是一个依赖于用于left join条件的除B表意外的所有表的一个集合。
>LEFT JOIN条件被用来决定怎么样检索B表中的行。(换句话说,任何在where中的查询条件都不用)
>所有的标准连接优化都会被执行,除非一个表一直被它依赖的全部表读取。如果查询中有环形依赖,则会报错。
>所有标准的WHERE优化会被执行。
>如果A中有一行能够满足where条件,但是B中没有行满足ON条件。则一个额外的行在B中生成用于连接,其中的值都是NULL。
>如果你使用LEFT JOIN去查找在一些表中不存在的行数据,而且你有查询条件:col_name is NULL 在where 查询部分,而且col_name 是一个被声明为NOT NULL的列,mysql会停止查找更多的行(对于一个特别的key组合),当他找到一行与左连接条件匹配的行时。
右连接的实现和左连接类似,只是表角色互换。右连接可以转换为等价的左连接,具体描述请看8.2.1.9的外链接的简单化。
连接优化器按照顺序计算连接中用到的表。被LEFT JOIN左连接或者STRAIGHT_JOIN直连接强制确定读取的表顺序帮助连接优化器更快的完成它的工作,因为只有很少的表需要排列去检查。这也意味着如果你执行一个查询按照如下的形式,那么mysql会完成一个在b表的全表扫描,因为LEFT JOIN会强制在读取d之前执行:
SELECT *
  FROM a JOIN b LEFT JOIN c ON (c.key=a.key)
  LEFT JOIN d ON (d.key=a.key)
  WHERE b.key=d.key;


修复这种情况通过修改a和b在from 中的顺序:
SELECT *
  FROM b JOIN a LEFT JOIN c ON (c.key=a.key)
  LEFT JOIN d ON (d.key=a.key)
  WHERE b.key=d.key;


对于一个左连接,如果where条件总是false也就是对于生成的NULL行,LEFT JOIN将会变成一个正常的连接。例如在如下的查询中如果t2.column1 是NULL,则where条件将会是false,不成立。
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;


因此,将其转为一个正常的连接是安全的:
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
现在优化器能够在在表t1之前使用表2,如果这样执行将会形成一个更好的执行计划。为了提供一个表连接顺序的提示,使用直连接(STRAIGHT_JOIN);具体请看13.2.9的select语法。然而,直连接可能阻止被用于查询的索引。因为它不支持semi-join的转变;具体请看8.2.2.1的优化子查询,派生表,和试图引用通过Semi-join的转变。
到此左连接和右连接的优化就结束了,接下来我们要说的是1.9 Outer Join Simplifiation 外连接的简单化.

左连接查询优化

左连接:以左表为基础,显示左表中的所有列,不管是否与关联条件相匹配,而右表中的数据只显示与关联条件相匹配的列,不匹配的列以NULL字符填充....
  • heart_2015
  • heart_2015
  • 2016年05月20日 10:09
  • 379

mysql5.7官网直译SQL语句优化--嵌套连接的优化

Nested Join Optimization(嵌套连接的优化) 允许嵌套连接的表达式语法。下面的描述引用在13.2.9.2的连接语法。 table_factor的语法是对标准sql比较的扩展。后者...
  • wu1226419614
  • wu1226419614
  • 2017年11月14日 16:05
  • 59

mysql5.7官网直译SQL语句优化--select语句优化

8.2 sql语句优化 大致内容如下: 8.2.1:SELECT语句的优化 8.2.2:优化子查询,派生表和试图引用 8.2.3:优化INFORMATION_SCHEMA查询 8.2.4:优化数据改变...
  • wu1226419614
  • wu1226419614
  • 2017年11月07日 15:18
  • 70

mysql5.7官网直译SQL语句优化--函数调用的优化

1.17 Function Call Optimization 函数调用的优化 mysql的函数被标记位确定或者是不确定的函数两大类。一个函数通过固定的入参多次调用返回不同的结果值,则被称为不确定函数...
  • wu1226419614
  • wu1226419614
  • 2017年11月26日 15:11
  • 69

mysql5.7官网直译SQL语句优化--索引合并的优化

索引合并是使用多个范围扫描去检索行数据并最终合并他们的结果为一个结果集的方法。这种合并至能发生在单一表的索引扫描上;不能夸表合并扫描结果。这个合并会产生union并集,交集,或者是既有并集又有交集。 ...
  • wu1226419614
  • wu1226419614
  • 2017年11月12日 09:40
  • 142

mysql5.7官网直译SQL语句优化--分组优化

1.14Group By Optimization 分组优化 大多数方法为了满足分组查询需要扫描整个表并且创建一个临时表,其中每组中的值都是连续的,如果可以使用聚合函数和临时表获取各个分组。在某些情况...
  • wu1226419614
  • wu1226419614
  • 2017年11月25日 21:19
  • 34

mysql5.7官网直译SQL语句优化--索引条件压入优化

1.5index Condition Pushdown Optimization(索引条件压入优化) 索引条件压入(ICP)是一个优化对于mysql从表中使用索引来检索行时。没有ICP,存储引擎遍历索...
  • wu1226419614
  • wu1226419614
  • 2017年11月12日 12:59
  • 78

mysql5.7官网直译SQL语句优化--排序优化

1.13ORDER BY Optimization 排序优化。 这部分描述当mysql能够使用一个索引去满足排序条件,filesort算法会被使用如果一个索引不能用的时候,和执行计划的信息关于优化器对...
  • wu1226419614
  • wu1226419614
  • 2017年11月19日 21:21
  • 32

mysql5.7官网直译SQL语句优化--多范围读取优化

1.10 Multi-Range Read(MRR) Optimization(多范围读取优化) 当使用一个范围扫描在一个二级索引上查找行数据会导致许多随机的磁盘访问对于基本表的查询,如果表比较大,并...
  • wu1226419614
  • wu1226419614
  • 2017年11月18日 10:43
  • 166

mysql5.7官网直译SQL语句优化--DISTINCT,LIMIT优化

1.15DISTINCT Optimization  DISTINCT和ORDER BY结合多数情况下需要一个临时表。 因为DISTINCT也许用到GROUP BY,了解mysql在order by列...
  • wu1226419614
  • wu1226419614
  • 2017年11月26日 11:29
  • 132
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql5.7官网直译SQL语句优化--左右连接的优化
举报原因:
原因补充:

(最多只允许输入30个字)