问题背景  对于 MySQL 的 JOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!);如果大家不知道怎么检验,可以试着回答如下的问题 驱动表的选择  MySQL 会如何选择驱动表,按从左至右的顺序选择第一个? 多表连接的顺序  假设我们有 3 张表:A、B、C,和如下 SQL ON、WHERE 的生效时机  楼主无意之间逛到了一篇博文,它里面有如下介绍 驱动表  何谓驱动表,指多表关联查询时,第一个被处理的表,亦可称之为基表,然后再使用此表的记录去关联其他表。驱动表的选择遵循一个原则:在对最终结果集没影响的前提下,优先选择结果集最少的那张表作为驱动表。这个原则说的不好懂,结果集最少,这个也许我们能估出来,但对最终结果集不影响,这个就不好判断了,难归难,但还是有一定规律的: SQL 执行的流程图  当我们向 MySQL 发送一个请求的时候,MySQL 到底做了些了什么 数据准备  MySQL 5.7.1,InnoDB 引擎;建表 SQL 和 数据初始 SQL 单表查询  单表查询的过程比较好理解,大致如下 联表算法  MySQL 的联表算法是基于嵌套循环算法(nested-loop algorithm)而衍生出来的一系列算法,根据不同条件而选用不同的算法 Simple Nested-Loop  简单嵌套循环,简称 SNL;逐条逐条匹配,就像这样 Block Nested-Loop  缓存块嵌套循环连接,简称 BNL,是对 INL 的一种优化;一次性缓存多条驱动表的数据,然后拿 Join Buffer 里的数据批量与内层循环读取的数据进行匹配,就像这样 Index Nested-Loop  索引嵌套循环,简称 INL,是基于被驱动表的索引进行连接的算法;驱动表的记录逐条与被驱动表的索引进行匹配,避免和被驱动表的每条记录进行比较,减少了对被驱动表的匹配次数,大致流程如下图 总结  1、驱动表的选择有它的一套算法,有兴趣的可以去专研下;比较靠谱的确定方法是用 EXPLAINhttps://blog.51cto.com/14455981/2459384 www.javathinker.net   
          
          
          
            [这个贴子最后由 flybird 在 2020-04-08 09:49:20 重新编辑] 
          
          
         
        
      
 
网站系统异常 
    
     系统异常信息  
    
     
       
         Request URL: 
http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3051本站管理人员 。