2019独角兽企业重金招聘Python工程师标准>>>

Using join buffer (Batched Key Access)

表连接算法

Batched Key Access(BKA)原理

MySQL 5.6版本提供了很多性能优化的特性,其中之一是关于提高表join性能的算法 --- Batched Key Access (BKA) ,本文将结合之前写过MRR,BNL优化特性一起来详细介绍该算法。

对于多表join语句,当MySQL使用索引访问第二个join表的时候,使用一个join buffer来收集第一个操作对象生成的相关列值。BKA构建好key后,批量传给引擎层做索引查找。key是通过MRR接口提交给引擎的。这样,MRR使得查询更有效率。

大致的过程如下:

  1. BKA使用join buffer保存由join的第一个操作产生的符合条件的数据。

  2. 然后BKA算法构建key来访问被连接的表,并批量使用MRR接口提交keys到数据库存储引擎去查找查找。

  3. 提交keys之后,MRR使用最佳的方式来获取行并反馈给BKA。

BKA使用join buffer size来确定buffer的大小,buffer越大,访问被join的表/内部表就越顺序。

MRR接口有2个应用场景:

场景1:应用于传统的基于磁盘的存储引擎(innodb,myisam),对于这些引擎join buffer中keys是一次性提交到MRR,MRR通过key找到rowid,通过rowid来获取数据

场景2:应用于远程存储引擎(NDB),来自join buffer上的部分key,从SQL NODE发送到DATA NODE,然后SQL NODE会收到通过相关关系匹配的行组合。然后使用这些行组合匹配出新行。然后在发送新key,直到发完为止。

BNL和BKA,MRR的关系

BNL和BKA都是批量的提交一部分结果集给下一个被join的表(标记为T),从而减少访问表T的次数,那么它们有什么区别呢?

BNL和BKA的思想是类似的,详情见:《nest-loop-join官方手册》

第一 BNL比BKA出现的早,BKA直到5.6才出现,而BNL至少在5.1里面就存在。

第二 BNL主要用于当被join的表上无索引,

Join buffering can be used when the join is of type ALL or index (in other words, when no possible keys can be used, and a full scan is done, of either the data or index rows, respectively)

第三 BKA主要是指在被join表上有索引可以利用,那么就在行提交给被join的表之前,对这些行按照索引字段进行排序,因此减少了随机IO,排序这才是两者最大的区别,但是如果被join的表没用索引呢?那就使用BNL了。

上面原理环境提到讲了在BKA实现的过程中就是通过传递keys给MRR接口,本质上还是在MRR里面实现,下面这幅图则展示了它们之间的关系:

如何使用

要使用BKA,必须调整系统参数optimizer_switch的值,batched_key_access设置为on,因为BKA使用了MRR,因此也要打开MRR,但是基于成本优化MRR算法不是特别准确官方文档推荐关闭

mrr_cost_based,将其设置为off。

set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'

另外多表join语句 ,被join的表/非驱动表必须索引可用。

==========END==========

转载于:https://my.oschina.net/xinxingegeya/blog/495899

Using join buffer (Batched Key Access)相关推荐

  1. mysql使用bka_MySQL Batched Key Access (BKA)原理和设置使用方法举例

    MySQL 5.6版本开始增加了提高表join性能的算法:Batched Key Access (BKA)的新特性. BKA算法原理:将外层循环的行/结果集存入join buffer,内存循环的每一行 ...

  2. MySQL 优化器之Index merge Multi-Range Read MRR与Batched Key Access使用案例详解

    MySQL 优化器之Index merge Multi-Range Read  MRR与Batched Key Access介绍 索引合并Index merge 覆盖索引是在索引里即有查询时需要的字段 ...

  3. mysql join buffer_MySQL cache之join buffer的优化

    MySQL cache之join buffer的优化 mysql的连接(join)处理只有nest loop一种算法,基本原理是先取第一个表的行,然后再依次 扫描第二个表中的所有行进行匹配,一旦匹配成 ...

  4. mysql优化之 Using where; Using join buffer (Block Nested Loop) ,索引失效,检查项

    mysql优化检查项 1. 查看表是否创建了字段索引 show index from tblname 建立索引的方法 CREATE INDEX 索引名称 USING BTREE ON 表名(字段名); ...

  5. MySQL Join Buffer参数查询命令

  6. mysql的join算法_mysql的Join算法-阿里云开发者社区

    实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 测试数据 CREATE TABLE `dept_emp` ( `emp_no` int(11) NOT NULL, `dept_no` char(4) N ...

  7. 数据库实践丨MySQL多表join分析

    Join并行 Join并行 1. 多表join介绍 2. 多表Join的方式 不使用Join buffer 使用Join buffer 3. Join执行流程(老执行器) 1. 多表join介绍 JO ...

  8. MySQL Join算法与调优白皮书

    转载自 InsideMySQL 公众号,微信公众号不好被搜索引擎收录,所以转载一份备看. 原文地址: https://mp.weixin.qq.com/s/vt7YjxaikJh14pnY2FAWvg ...

  9. 技本功丨请带上纸笔刷着看:解读MySQL执行计划的type列和extra列

    本萌最近被一则新闻深受鼓舞,西工大硬核"女学神"白雨桐,获6所世界顶级大学博士录取通知书. 货真价值的才貌双全,别人家的孩子 高考失利与心仪的专业失之交臂,选择了软件工程这门自己完 ...

最新文章

  1. iOS 解决app退出后台应用重新启动的问题
  2. 刻意练习:LeetCode实战 -- Task01. 两数之和
  3. 无法创建文件系统以及无法创建PV时怎么办?
  4. 计算机的定点运算器原理,计算机组成原理定点运算器的组成及结构.doc
  5. Python中map()函数用法
  6. 对.NET的GC(垃圾回收)的理解都存在错误认识
  7. 【Flink】Flink network netty ProducerFailedException SimpleChannelInboundHandler NullPointerException
  8. Selenium2+python自动化34-获取百度输入联想词
  9. 哈,我再xp Professional上安装SqlServer2005桌面管理器
  10. c 调用python clion_CLion 2018.1.3 功能超级强大的跨平台 C 开发工具
  11. 深度学习 --- 卷积神经网络CNN(LeNet-5网络学习算法详解)
  12. 社会达尔文主义 盛行时间_新达尔文主义的心理理论
  13. php获取csv文件乱码,php使用fgetcsv读取csv文件乱码解决方法
  14. 用HTML5为你的网页添加音效(兼容Firefox 3.5+, IE 6-9, Safari 3.0+, Chrome 3.0+, Opera 10.5+)...
  15. python实现英文新闻摘要自动提取_“关键字”法完成新闻摘要提取
  16. backdrop-filter
  17. php mysql 单引号_插入MySQL时转义PHP中的单引号
  18. 【六芒星人群洞察】小红书品牌流量收割新路径
  19. SpringBoot Zxing _ Java 生成二维码(可内嵌图片)
  20. vue 省市区三级联动 antd 级联组件 Cascader

热门文章

  1. QTP对象TO与RO
  2. 【牛客网多校】19-7-25-H题 Magic Line
  3. 使用 requests 配置代理服务
  4. jQuery可放大预览的图片滑块
  5. Question: Database Of Tumor Suppressors And/Or Oncogenes
  6. 【Luogu】P1896互不侵犯King(状压DP)
  7. 【转载 译自MarketWatch 】 华尔街疯人日记 (二十五)
  8. 设置Qt应用程序图标
  9. UOJ #297. 一样远
  10. tcp3次握手,https加密,ca认证