Block Nested-Loop 和 Batched Key Access
官方文档:https://dev.mysql.com/doc/refman/5.7/en/bnl-bka-optimization.html
BNL和BKA是MySQL 表关联的两种关联算法
比如t1、t2、t3关联查询且查询顺序和关联顺序一致,MySQL处理join的过程一般是
t1和t2的关联的结果集放入join buffer B1,分配到join buffer时,varchar类型字段的长度是最小的分配单元,所以varchar也指定合适长度,以免浪费内存。
B1中的结果集再和t3进行匹配,将匹配的结果集放入join buffer B2,B2是增量的buffer,因为B2中存放的是t3匹配的column和与之匹配的row的位置链接
当内表的查询类型是all、index或range的时候才会走BNL,explain输出的extra是Using join buffer (Block Nested Loop)
BAK和BNL的别在于所有的右表和左结果集匹配时走辅助索引。BAK会一次性提交B1中与t2关联的column到Multi-Range Read (MRR)接口与t2的索引进行
匹配,然后通过MRR返回匹配的按主键排序的key,从而减少回表时产生的随机I/O。join_buffer_size的大小决定BAK每次批处理提交给MRR的key的大小,
适当增大join_buffer_size 的大小可以有效的提高关联查询的性能。
内表的查询类型是ref或eq_ref时join会采用BAK,explain的extra输出为Using join buffer (Batched Key Access)
BNL默认开启,而BKA默认时关闭的,如果要开启BAK,需要一起开始MRR
mysql> SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
Block Nested-Loop 和 Batched Key Access的更多相关文章
- MySQL Block Nested Loop and Batched Key Access Joins(块嵌套循环和批量Key访问连接)
Block Nested-Loop and Batched Key Access Joins Batched Key Access (BKA) Join算法通过index和join buffer访问j ...
- MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins
MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins 在MySQL中,可以使用批量密钥访问(BKA)连接算法,该算法使用对连接表的索引访问和 ...
- 解决:Using where; Using join buffer (Block Nested Loop)
问题:left join 时候触发了全表查询导致很慢 解决:Using where; Using join buffer (Block Nested Loop) 总结:其实就是把left join 改 ...
- MySQL Batched Key Access
Batched Key Access是MySQL 5.6 版本中的新特性,是一种用户提高表join性能的算法.[Batched Key Access] 对于多表join语句,当MySQL使 ...
- 44 答疑(三)--join的写法/Simple nested loop join的性能问题/Distinct和group by的性能/备库自增主键问题
44 答疑(三) Join的写法 35节介绍了join执行顺序,加了straight_join,两个问题: --1 如果用left join,左边的表一定是驱动表吗 --2 如果两个表的join包含多 ...
- 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)
转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍 相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...
- Sql优化(一) Merge Join vs. Hash Join vs. Nested Loop
原创文章,首发自本人个人博客站点,转载请务必注明出自http://www.jasongj.com Nested Loop,Hash Join,Merge Join介绍 Nested Loop: 对于被 ...
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...
- oracle 表连接 - nested loop 嵌套循环连接
一. nested loop 原理 nested loop 连接(循环嵌套连接)指的是两个表连接时, 通过两层嵌套循环来进行依次的匹配, 最后得到返回结果集的表连接方法. 假如下面的 sql 语句中表 ...
随机推荐
- Redis基础数据结构
Redis数据库中每个键值对都是由对象( c 的结构体对象)组成的. 数据库键总是一个字符串对象(string object) 数据库键的值可以使字符串对象.列表对象(list object).哈希对 ...
- UVA 12034 Race(递推)
递推,f[i = i个名次][j = 共有j个人] = 方案数. 对于新加入的第j个人,如果并列之前的某个名次,那么i不变,有i个可供并列的名次选择,这部分是f[i][j-1]*i, 如果增加了一个名 ...
- clearerr, feof, ferror, fileno - 检查以及重置流状态
总览 (SYNOPSIS) #include <stdio.h> void clearerr(FILE *stream); int feof(FILE *stream); int ferr ...
- 在O(1)时间复杂度删除链表节点
题目描述: 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 您在真实的面试中是否遇到过这个题? Yes 样例 给定 1->2->3-> ...
- python_14_sys_mod
import sys #1 print(sys.path)#打印环境变量 #2 print(sys.argv)#打印相对路径 print(sys.argv[2])#在cmd命令窗口运行本文件
- Windows8.1任务栏取消oneDrive图标
Windows8.1任务栏会有oneDrive图标,用不着,想取消,方法如下:
- CSS3和动画
定位: z-index叠层 数字越大越往上层 注意:要用z-index属性必须设position属性 溢出:overflow 属性值:visible 不剪切内容也不添加滚动条 Auto ...
- DOTA自走棋卡牌及搭配阵容
这个游戏其实就根炉石jjc和A牌轮抽一样,前期要找着质量牌抓,保证你至少不漏.根据你的需求补一些你不会上场的阵容组件,最后根据你的组件和核心紫卡来哪张来决定打什么.另外也要考虑场上另外几家,如果有一家 ...
- maven手动导入jar包到本地仓库
一.cmd进入maven的bin目录下(我的目录是E:\cloud_cms\apache-maven-3.5.4\bin) cd E:\cloud_cms\apache-maven-3.5.4\bin ...
- 二十、Mysql 连接的使用
Mysql 连接的使用 在前几章节中,我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据. 本章节我们将向大家介绍如何使用 MySQL 的 JOIN ...