MySQL 5.6版本开始增加了提高表join性能的算法:Batched Key Access (BKA)的新特性。

BKA算法原理:将外层循环的行/结果集存入join buffer,内存循环的每一行数据与整个buffer中的记录做比较,

可以减少内层循环的扫描次数.

对于多表join语句,当MySQL使用索引访问第二个join表的时候,使用一个join buffer来收集第一个操作对象生成

的相关列值。BKA构建好key后,批量传给引擎层做索引查找。key是通过MRR接口提交给引擎的,

这样,MRR使得查询更有效率。

如果外部表扫描的是主键,那么表中的记录访问都是比较有序的,但是如果联接的列是非主键索引,那么对于表中记录

的访问可能就是非常离散的。因此对于非主键索引的联接,Batched Key Access Join算法

将能极大提高SQL的执行效率。BKA算法支持内连接,外连接和半连接操作,包括嵌套外连接。

Batched Key Access Join算法的工作步骤如下:

1) 将外部表中相关的列放入Join Buffer中。

2) 批量的将Key(索引键值)发送到Multi-Range Read(MRR)接口。

3) Multi-Range Read(MRR)通过收到的Key,根据其对应的ROWID进行排序,然后再进行数据的读取操作。

4) 返回结果集给客户端。

对于多表join语句,当MySQL使用索引访问第二个join表的时候,使用一个join buffer来收集第一个操作对象生成的相关

列值。BKA构建好key后,批量传给引擎层做索引查找。key是通过MRR接口提交给引擎 的(mrr目的是较为顺序).

这样,MRR使得查询更有效率。

大致的过程如下:

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

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

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

BNL(Block Nested Loop)和BKA(MySQL Batched Key Access)都是批量的提交一部分行给被join的表,从而减少访问的

次数,那么它们有什么区别呢?

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

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

第三 BKA主要是指在被join表上有索引可以利用,那么就在行提交给被join的表之前,对这些行按照索引字段进行排序,

因此减少了随机IO,排序这才是两者最大的区别,但是如果被join的表没用索引呢?

那就使用BNL了。

以下设置启用BKA:

要使用BKA,必须调整系统参数optimizer_switch的值,官方推荐关闭mrr_cost_based,应将其设置为off。

mysql> SET global optimizer_switch=’mrr=on,mrr_cost_based=off,batched_key_access=on’;

备注:

BKA主要适用于join的表上有索引可利用,无索引只能使用BNL。

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

在EXPLAIN输出中,当Extra值包含Using join buffer(Batched Key Access),表示使用BKA。

+——————————————————–+

| Extra                                                                           |

+——————————————————–+

| NULL                                                                           |

| Using where; Using join buffer (Batched Key Access)|

+———————————————————+

使用hint,强制走BKA的方法:

例如:

mysql使用bka_MySQL Batched Key Access (BKA)原理和设置使用方法举例相关推荐

  1. Using join buffer (Batched Key Access)

    2019独角兽企业重金招聘Python工程师标准>>> Using join buffer (Batched Key Access) 表连接算法 Batched Key Access ...

  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】ERROR 1045 (28000): Access denied for user的解决方法

    [MySQL]ERROR 1045 (28000): Access denied for user的解决方法 参考文章: (1)[MySQL]ERROR 1045 (28000): Access de ...

  4. MySQL · 特性分析 · 优化器 MRR BKA

    什么是 MRR MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段,咱们对比一下 mrr=on ...

  5. MySQL索引背后的数据结构及算法原理【转】

    http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...

  6. mysql explain详解_数据库mysql(1)——B+TREE索引原理

    一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...

  7. MySQL索引背后的数据结构及算法原理--转

    MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10-18 MySQL 索引 B树 优化 原文地址:http://blog.codinglabs.org/articles/t ...

  8. MySQL 索引背后的数据结构及算法原理

    本文转载自http://blog.jobbole.com/24006/ 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储 ...

  9. 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)

    [MySQL进阶]MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!) 参考资料: 美团技术团队:Innodb中事务隔离级别和锁的关系 数据库的锁,到底锁的是什么? 阿里面试:说说一致性读实现原 ...

最新文章

  1. Docker-tag
  2. 7 Redis 事务
  3. 一篇文章教你弄懂SpringMvc中的HttpMessageConverter
  4. ajax 调用后台的方法
  5. wine 运行Adobe Audition 3.0方法
  6. 教你前端input框只允许输入正整数
  7. c语言学习-编写递归函数用于计算n!
  8. 怎样在word文档画虚线_班级工作小技巧——怎样在word里画出美观正式的四线三格?...
  9. (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
  10. 团队项目:第二次冲刺站立会议08
  11. nagios监控php使用情况,给nagios增加监控当前php进程数的插件,并用pnp出图
  12. 计算机维修与维护怎么学,做电脑维修需要学习哪些知识呢?
  13. Photoshop-RGB色彩模式
  14. 进程锁、事件、进程队列、进程间共享数据、生产者消费者模型
  15. HANA 如何创建XS Job来完成定时任务
  16. Zookeeper重要概念
  17. 7.python基础之基础数据类型--字典dict
  18. 机器人潘森护盾_[翻译团]10.21版本五大强势辅助:潘森、蕾欧娜、机器人、巴德、璐璐...
  19. AOJ 2543 Ancient Scrolls
  20. vo、po、dto、bo、pojo、entity、mode如何区分

热门文章

  1. (操作系统实验)第四次说明
  2. 使用three.js实现炫酷的酸性风格3D页面
  3. java junit Assert断言用法示例: Assert.assertEquals(期望的结果,运算的结果)
  4. vue v-for指令
  5. spark重要参数调优建议:spark.default.parallelism设置每个stage默认的task数量
  6. 阿里DataV可视化大屏介绍
  7. ubuntu卸载openjdk-11
  8. IDEA常用快捷键整理20191105
  9. Vue调用后端接口http ajax请求组件封装及proxyTable跨域问题解决超详细案例
  10. 远程桌面上的文件复制到本地