mysql使用bka_MySQL Batched Key Access (BKA)原理和设置使用方法举例
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)原理和设置使用方法举例相关推荐
- Using join buffer (Batched Key Access)
2019独角兽企业重金招聘Python工程师标准>>> Using join buffer (Batched Key Access) 表连接算法 Batched Key Access ...
- MySQL 优化器之Index merge Multi-Range Read MRR与Batched Key Access使用案例详解
MySQL 优化器之Index merge Multi-Range Read MRR与Batched Key Access介绍 索引合并Index merge 覆盖索引是在索引里即有查询时需要的字段 ...
- 【MySQL】ERROR 1045 (28000): Access denied for user的解决方法
[MySQL]ERROR 1045 (28000): Access denied for user的解决方法 参考文章: (1)[MySQL]ERROR 1045 (28000): Access de ...
- MySQL · 特性分析 · 优化器 MRR BKA
什么是 MRR MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段,咱们对比一下 mrr=on ...
- MySQL索引背后的数据结构及算法原理【转】
http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引背后的数据结构及算法原理[转] 摘要 本文以MySQL数据库 ...
- mysql explain详解_数据库mysql(1)——B+TREE索引原理
一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...
- MySQL索引背后的数据结构及算法原理--转
MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10-18 MySQL 索引 B树 优化 原文地址:http://blog.codinglabs.org/articles/t ...
- MySQL 索引背后的数据结构及算法原理
本文转载自http://blog.jobbole.com/24006/ 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储 ...
- 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)
[MySQL进阶]MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!) 参考资料: 美团技术团队:Innodb中事务隔离级别和锁的关系 数据库的锁,到底锁的是什么? 阿里面试:说说一致性读实现原 ...
最新文章
- Docker-tag
- 7 Redis 事务
- 一篇文章教你弄懂SpringMvc中的HttpMessageConverter
- ajax 调用后台的方法
- wine 运行Adobe Audition 3.0方法
- 教你前端input框只允许输入正整数
- c语言学习-编写递归函数用于计算n!
- 怎样在word文档画虚线_班级工作小技巧——怎样在word里画出美观正式的四线三格?...
- (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
- 团队项目:第二次冲刺站立会议08
- nagios监控php使用情况,给nagios增加监控当前php进程数的插件,并用pnp出图
- 计算机维修与维护怎么学,做电脑维修需要学习哪些知识呢?
- Photoshop-RGB色彩模式
- 进程锁、事件、进程队列、进程间共享数据、生产者消费者模型
- HANA 如何创建XS Job来完成定时任务
- Zookeeper重要概念
- 7.python基础之基础数据类型--字典dict
- 机器人潘森护盾_[翻译团]10.21版本五大强势辅助:潘森、蕾欧娜、机器人、巴德、璐璐...
- AOJ 2543 Ancient Scrolls
- vo、po、dto、bo、pojo、entity、mode如何区分
热门文章
- (操作系统实验)第四次说明
- 使用three.js实现炫酷的酸性风格3D页面
- java junit Assert断言用法示例: Assert.assertEquals(期望的结果,运算的结果)
- vue v-for指令
- spark重要参数调优建议:spark.default.parallelism设置每个stage默认的task数量
- 阿里DataV可视化大屏介绍
- ubuntu卸载openjdk-11
- IDEA常用快捷键整理20191105
- Vue调用后端接口http ajax请求组件封装及proxyTable跨域问题解决超详细案例
- 远程桌面上的文件复制到本地