【MySQL】MySQL5.6新特性之Batched Key Access

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 一 介绍  MySQL 5.6版本提供了很多性能优化的特性,其中之一是关于提高表join性能的算法 --- Batched Key Access (BKA) ,本文将结合之前写过MRR,BNL优化特性一起来详细介绍该算法。
一 介绍
  MySQL 5.6版本提供了很多性能优化的特性,其中之一是关于提高表join性能的算法 --- Batched Key Access (BKA) ,本文将结合之前写过MRR,BNL优化特性一起来详细介绍该算法。这篇文章是
我拖延时间最久的,之前一直没有搞清楚MRR,BKA之间的关联 ,BKA,BNL的区别,本周花了一天时间收集资料,算是搞懂了,里面有基于文档翻译的,可能不准确,请大家指正。

二 原理

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

大致的过程如下:
  1. 1 BKA使用join buffer保存由join的第一个操作产生的符合条件的数据。
  2. 2 然后BKA算法构建key来访问被连接的表,并批量使用MRR接口提交keys到数据库存储引擎去查找查找。
  3. 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的次数,那么它们有什么区别呢?NBL和BKA的思想是类似的,详情见:《nest-loop-join官方手册》
 第一 NBL比BKA出现的早,BKA直到5.6才出现,而NBL至少在5.1里面就存在。
 第二 NBL主要用于当被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的表没用
索引呢?那就使用NBL了。

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

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

  1. set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'
 另外多表join语句 ,被join的表/非驱动表必须索引可用。

五 参考资料
[1].Block Nested-Loop and Batched Key Access Joins
[3].Block-Based Join Algorithms
[4].Join Optimizations in MySQL 5.6 and MariaDB 5.5 
[5].bacthed-key-access-speeds-up-disk-bound 
[6].Multi Range Read Optimization 
[7].On the multi range read&batch key access&block nested loop

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
关系型数据库 MySQL
【mysql】快速使用mysql exists 语法
【mysql】快速使用mysql exists 语法
47 1
|
2天前
|
SQL 存储 关系型数据库
Mysql的NULLIF
Mysql的NULLIF
13 1
|
16天前
|
关系型数据库 MySQL Serverless
MySQL中的having和where的区别
总之,`WHERE` 用于过滤原始数据,`HAVING` 用于在 `GROUP BY` 后对聚合数据进行筛选。它们分别适用于不同的查询需求。
14 0
|
8月前
|
存储 SQL JSON
MySQL学习---17、MySQL8其它新特性
MySQL学习---17、MySQL8其它新特性
|
9月前
|
存储 安全 关系型数据库
【MySQL】一文带你了解如何使用MySQL
【MySQL】一文带你了解如何使用MySQL
75 0
|
10月前
|
Java 数据库连接
MySQL5版本的配置改成MySQL8
MySQL5版本的配置改成MySQL8
160 0
MySQL5版本的配置改成MySQL8
|
SQL 关系型数据库 MySQL
【MySQL】server-id=1,是干什么的?底层原理是什么?
【MySQL】server-id=1,是干什么的?底层原理是什么?
903 0
|
SQL 关系型数据库 MySQL
mysql中“=”和“:=”的区别
mysql中“=”和“:=”的区别
mysql中“=”和“:=”的区别
|
SQL 关系型数据库 MySQL
MySQL - WHERE & HAVING 区别
MySQL - WHERE & HAVING 区别
82 0
|
存储 SQL 缓存
MySQL 深潜 - 一文详解 MySQL Data Dictionary
# 背景 在 MySQL 8.0 之前,Server 层和存储引擎(比如 InnoDB)会各自保留一份元数据(schema name, table definition 等),不仅在信息存储上有着重复冗余,而且可能存在两者之间存储的元数据不同步的现象。不同存储引擎之间(比如 InnoDB 和 MyISAM)有着不同的元数据存储形式和位置(.FRM, .PAR, .OPT, .TRN and .TR
326 0