ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL 表连接策略 NLJ vs BNL

2022-07-29 00:31:42  阅读:222  来源: 互联网

标签:join buffer MySQL t2 t1 vs BNL Nested Loop


select * from t1 join t2 on t1.c = t1.c 这样的语句,mysql优化器会选择t_a或t_b作为驱动表, 使用straight_join来指定 左边的表为驱动表。如果字段c上有建立索引,MySQL会使用 Index Nested-Loop Join 策略处理join,否则会使用Block Nested-Loop Join 来处理。

什么是Index Nested-Loop Join

如果连接表的字段上索引,会使用index nested-loop join 算法,会这样处理:

  1. 从驱动表t1取出记录一行记录R;
  2. 根据连接字段去t2搜索;
  3. 取出匹配的t2记录,跟R组成一行,作为结果集的一部分。
  4. 重复值执行以上步骤,直到扫描完t1

在这个过程中,驱动表是走全表扫描,而被驱动表是走树搜索

  1. 使用join语句,性能比强行拆成多个单表执行SQL语句的性能要好;
  2. 如果使用join语句的话,需要让小表做驱动表。

什么是 Block Neste-Loop Join

由于连接字段没有索引,这次不能通过走树索引去查询t2表了。查询过程如下:

  1. 扫描t1,顺序读数据放入join_buffer, 如果join_buffer满了,则分多次存入。
  2. 扫描t2,与join_buffer中的记录对比
  3. 清空join_buffer
  4. 重复上面步骤,直到t1扫描完成。

这个过程中,t2会被扫描多次,减少t1加载进join_buffer的次数,可以优化查询效率。join_buffer_size 参数控制了join_buffer的大小,如果join很慢,尝试改大这个join_buffer_size。
驱动表会被分多次放进join_buffer_size, 因此驱动表越小越好

Block Nested-Loop join 会占用大量的系统资源,如果在explain结果中,看到Block Nested Loop,尝试在连接的字段加索引吧

标签:join,buffer,MySQL,t2,t1,vs,BNL,Nested,Loop
来源: https://www.cnblogs.com/linyihai/p/16530838.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有