zoukankan      html  css  js  c++  java
  • 【mysql 优化 5】左连接和右连接优化

    原文地址:8.2.1.8 Left Join and Right Join Optimization


    mysql以下列方式实现一个A left join B 连接条件:

    1,表B设置为依赖于表A和A所依赖的所有表

    2,表A设置为依赖使用left join条件的所有表(除了B)

    3,left join条件被用于决定如何从表B中取数据行(换句话说,不使用WHERE子句的任何条件)

    4,执行所有标准的连接优化,有一个例外:一个表总是在依赖的所有表之后,读取表数据(个人补充:就是说当你采用连接查询时,读取数据,总是在将所有依赖的表进行连接操作以后)。如果有循环依赖关系,则会发生错误。

    5,执行所有标准的where 优化

    6,如果在表A中有一行数据符合WHERE子句,但是在表B中并没有这么一行符合 on 条件。一个额外的行将被创建,并且填充数据为null

    7,如果您使用LEFT JOIN来查找某些表中不存在的行,并且具有以下测试:在WHERE子句中col_name IS NULL,其中col_name声明为NOT NULL列,则MySQL在找到一行数据符合left join条件后,将停止搜索更多行。


    RIGHT JOIN的实现与LEFT JOIN类似,表格角色相反。右连接被转换为等效的左连接。详情请看: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;
    去改变这种情况,是颠倒 FROM 子句中a 和 b的顺序:

    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;
    对于LEFT JOIN,如果生成的NULL行的WHERE条件总是为false,则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之前使用表t2,如果这样做会产生更好的查询计划。要提供关于表连接顺序的提示,请使用STRAIGHT_JOIN。但是,STRAIGHT_JOIN可能会阻止使用索引,因为它禁用半连接转换


  • 相关阅读:
    parseInt()的用法
    报文
    express的中间件与next()
    前后端分离与前后端不分离
    jQuery中四个绑定事件的区别 on,bind,live,delegate
    TCP传输的三次握手四次挥手策略
    报文
    HTTP和HTTPS以及两者的区别
    前后端不分离与分离
    express中间件的next()方法
  • 原文地址:https://www.cnblogs.com/hhx626/p/7534576.html
Copyright © 2011-2022 走看看