【MySQL精通之路】SQL优化(1)-查询优化(12)-块嵌套循环和批处理Key访问联接

 

在MySQL中,可以使用批处理Key访问(BKA)联接算法,该算法使用对联接表的索引访问联接缓冲区

BKA算法支持内联接、外联接和半联接操作,包括嵌套的外部联接。

BKA的优点包括由于更高效的表扫描提高了联接性能

此外,以前仅用于内部联接的块嵌套循环(BNL)联接算法得到了扩展,可以用于外部联接半联接操作,包括嵌套的外部联接。

以下部分讨论连接缓冲区管理,它是原始BNL算法扩展的BNL算法BKA算法扩展的基础。

有关半联接策略的信息,请参阅“使用半联接转换优化IN和EXISTS子查询语句”

1.连接缓冲区管理

MySQL不仅可以使用联接缓冲区来执行内部联接,而无需对内部表进行索引访问,还可以使用子查询展开后出现的外部联接半联接。此外,当存在对内部表的索引访问时,可以有效地使用联接缓冲区

连接缓冲区管理代码在存储感兴趣的行列的值时稍微更有效地利用连接缓冲区空间:

如果行列的数值为NULL,则不会在缓冲区中为其分配额外的字节,并且为VARCHAR类型的任何数值分配最小字节数。

该代码支持两种类型的缓冲区,常规缓冲区增量缓冲区。假设联接缓冲器B1用于联接表t1t2,并且该操作的结果使用联接缓冲器B2与表t3联接:

常规联接缓冲区包含来自每个联接操作数的列。如果B2是常规联接缓冲器,则放入B2的每一行rB1中的行r1的列表t3中的匹配行r2的感兴趣列组成。

增量联接缓冲区仅包含由第二个联接操作数生成的表的行中的列。也就是说,它是从第一个操作数缓冲区向一行递增的。如果B2是增量联接缓冲区,则它包含行r2的感兴趣的列以及从B1到行r1的链接

        增量连接缓冲区相对于早期连接操作的连接缓冲区始终是增量的,因此第一次连接操作的缓冲区始终为常规缓冲区。在刚刚给出的示例中,用于连接表t1和t2的缓冲器B1必须是常规缓冲器。

        用于联接操作的增量缓冲区的每一行只包含要联接的表中一行中感兴趣的列。通过引用第一个联接操作数生成的表中匹配行中感兴趣的列来扩充这些列。增量缓冲区中的几行可以引用同一行r,只要所有这些行都与行r匹配,则该行的列存储在先前的联接缓冲区中。

        增量缓冲区可以减少从用于先前联接操作的缓冲区复制列的频率。这提供了缓冲区空间的节省,因为在一般情况下,第一联接操作数产生的行可以与第二联接操作数生成的若干行相匹配。没有必要从第一个操作数复制一行的多个副本。由于复制时间的减少,增量缓冲区还可以节省处理时间。

在MySQL 8.0中,optimizer_switch系统变量block_nested_roop标志的工作原理如下:

在MySQL 8.0.20之前,它控制优化器如何使用块嵌套循环连接算法。

在MySQL 8.0.18及更高版本中,它还控制散列联接的使用(请参阅第10.2.1.4节“散列联接优化”)。

从MySQL 8.0.20开始,该标志仅控制哈希联接不再支持块嵌套循环算法。


batched_key_access标志控制优化器如何使用batched key access联接算法。

默认情况下,block_nested_roop处于打开状态,batched_key_access处于关闭状态。

请参阅“可切换优化”。

也可以应用优化器提示;请参阅 块嵌套循环和批量密钥访问算法的优化器提示。

有关半联接策略的信息,请参阅“使用半联接转换优化IN和EXISTS子查询语句”

2.外联接和半联接的块嵌套循环算法

MySQL BNL算法的原始实现被扩展为支持外部联接半联接操作

(后来被哈希联接算法取代;请参阅“哈希联接优化”)。

【MySQL精通之路】SQL优化(1)-查询优化(4)-Hash联接查询-CSDN博客

当使用联接缓冲区执行这些操作时,放入缓冲区的每一行都会被提供一个匹配标志。

如果使用联接缓冲区执行外部联接操作,则会检查第二个操作数生成的表的每一行是否与联接缓冲区中的每一行都匹配。当找到匹配项时,将形成一个新的扩展行(原始行加上第二个操作数中的列),并通过剩余的联接操作发送以进行进一步的扩展。此外,缓冲区中匹配行的匹配标志被启用。在检查了要联接的表的所有行之后,扫描联接缓冲区。缓冲区中未启用匹配标志的每一行都将通过NULL补码(第二个操作数中每列的NULL值)进行扩展,并通过剩余的联接操作进行进一步扩展。

在MySQL 8.0中,optimizer_switch系统变量的block_nested_roop标志的工作原理如下:

在MySQL 8.0.20之前,它控制优化器如何使用块嵌套循环连接算法。

在MySQL 8.0.18及更高版本中,它还控制散列联接的使用(请参阅“Hash联接优化”)。

【MySQL精通之路】SQL优化(1)-查询优化(4)-Hash联接查询-CSDN博客

从MySQL 8.0.20开始,该标志仅控制哈希联接,不再支持块嵌套循环算法。

有关更多信息,请参见第10.9.2节“可切换优化”。也可以应用优化器提示;请参阅块嵌套循环和批量密钥访问算法的优化器提示。

在EXPLAIN输出中,当Extra值包含Using join buffer(块嵌套循环)并且类型值为ALL、index或range时,表示表使用BNL。

有关半联接策略的信息,请参阅第10.2.2.1节“使用半联接转换优化IN和EXISTS子查询谓词”

3.批量Key访问联接

MySQL实现了一种连接表的方法,称为批处理密钥访问(BKA)连接算法。当对第二个联接操作数生成的表进行索引访问时,可以应用BKA。与BNL联接算法一样,BKA联接算法使用联接缓冲区来累积由联接运算的第一个操作数产生的行的感兴趣的列。然后,BKA算法为缓冲区中的所有行构建访问要连接的表的键,并将这些键分批提交给数据库引擎进行索引查找。钥匙通过多量程读取(MRR)接口提交给发动机(参见第10.2.1.11节“多量程读取优化”)。提交键后,MRR引擎功能以最佳方式在索引中执行查找,获取由这些键找到的联接表的行,并开始向BKA联接算法提供匹配的行。每个匹配行都与连接缓冲区中一行的引用相耦合。

当使用BKA时,join_buffer_size的值定义了向存储引擎发出的每个请求中密钥批的大小。缓冲区越大,对联接操作的右侧表的顺序访问就越多,这可以显著提高性能。

对于要使用的BKA,优化器切换系统变量的batched_key_access标志必须设置为on。BKA使用MRR,因此MRR标志也必须为on。目前,MRR的成本估计过于悲观。因此,也有必要关闭mrr_cost_based以使用BKA。以下设置启用BKA:

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

 执行MRR功能有两种情况:

第一种场景用于传统的基于磁盘的存储引擎,如InnoDB和MyISAM。对于这些引擎,通常会将连接缓冲区中所有行的密钥一次提交到MRR接口。特定于引擎的MRR函数对提交的键执行索引查找,从中获取行ID(或主键),然后根据BKA算法的请求逐个获取所有这些选定行ID的行。每一行都返回一个关联引用,该引用允许访问联接缓冲区中匹配的行。MRR函数以最佳方式提取行:按行ID(主键)顺序提取行。这提高了性能,因为读取是按磁盘顺序而不是随机顺序进行的。

第二种场景用于NDB等远程存储引擎。MySQL Server(SQL节点)将联接缓冲区中一部分行的密钥包及其关联发送到MySQL Cluster数据节点。作为回报,SQL节点接收与相应关联耦合的匹配行的包(或多个包)。BKA联接算法获取这些行并构建新的联接行。然后,将一组新的键发送到数据节点,并使用返回包中的行来构建新的连接行。该过程一直持续到连接缓冲区中的最后一个键被发送到数据节点,并且SQL节点已经接收并连接了所有与这些键匹配的行。这提高了性能,因为SQL节点向数据节点发送的密钥承载包更少,意味着它与数据节点之间执行联接操作的往返次数更少。

在第一种情况下,联接缓冲区的一部分被保留来存储由索引查找选择的行ID(主键),并作为参数传递给MRR函数。

没有特殊的缓冲区来存储为联接缓冲区中的行构建的键。相反,为缓冲区中的下一行构建键的函数将作为参数传递给MRR函数。

在EXPLAIN输出中,当Extra值包含Using join buffer(Batched Key Access)并且类型值为ref或eq_ref时,表示表使用BKA。

4.优化器提示

除了使用optimizer_switch系统变量来控制优化器在会话范围内使用BNLBKA算法之外,MySQL还支持优化器提示,以在每条语句的基础上影响优化器。

参见“优化器提示”。

若要使用BNLBKA提示为外部联接任何内部表启用联接缓冲,则必须为该外部联接所有内部表启用联接缓冲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ai智能写作怎么样,5款ai写作软件创作文章太棒了

ai智能写作究竟怎么样呢?在当今数字化的时代,AI智能写作正逐渐成为一种引人瞩目的趋势。AI智能写作是指利用人工智能技术来辅助或代替人类进行文本创作的过程。随着人工智能技术的不断发展,AI智能写作在各个领域都呈现出越来越广泛的应用。本…

微服务架构下的‘黑带’安全大师:Spring Cloud Security全攻略!

深入探讨了微服务间的安全通信、安全策略设计以及面对经典安全问题的应对策略。无论你是微服务的新手还是资深开发者,都能在本文中找到提升安全功力的秘籍。让我们一起成为微服务架构下的‘黑带’安全大师! 文章目录 1. 引言微服务安全挑战与重要性Sprin…

2024-05-28 blue-VH-driver-需求分析及问题分析

摘要: 2024-05-28 blue-VH-driver-需求分析,VH是个数据库,需要写一个driver,形态是dll/so动态库,调用VH的接口,然后给上层的标准数据服务去调用。 这个需求会涉及很多隐含的可能出问题的地方,需要详细分析…

Session和JWT(JSON Web Token)的对比

Session和JWT(JSON Web Token)都是用于用户身份验证和授权的机制,但它们的工作原理、存储位置、可扩展性和安全性等方面有所不同。以下是两者之间的主要区别: 工作原理与存储位置: Session:Session机制依赖…

详细介绍R语言在数据分析中的应用

R语言在数据分析领域扮演着举足轻重的角色,其强大的数据处理能力、丰富的统计函数和绘图功能使得数据分析变得更加高效和直观。下面将结合几个具体的数据分析案例,详细介绍R语言在数据分析中的应用 ### 案例一:电商用户行为分析 **背景介绍…

SHELL编程(三)网络基础命令 Makefile

目标 一、网络基础及相关命令(一)网络相关命令(二)重启网络服务 二、Makefile(一)标签式语法(二)目标:依赖 式语法1. 格式2. 编译流程:预处理 编译 汇编 链接3. 目标和伪…

keep-alive 使用场景和原理

Vue keep-alive 使用场景 列表数据展示: 当列表数据展示较为复杂,渲染速度可能较慢时,可以使用 keep-alive 组件缓存列表组件,避免重复渲染,提高性能。通过将列表组件包裹在 keep-alive 组件中,当数据变化时…

Java入门基础学习笔记50——ATM系统

1、项目演示; 2、项目技术实现; 1)面向对象编程: 每个账户都是一个对象,所以要设计账户类Account,用于创建账户对象封装账户信息。ATM同样是一个对象,需要设计ATM类,代表ATM管理系…

windows tomcat服务注册和卸载

首页解压tomcat压缩包,然后进入tomcat bin目录,在此目录通过cmd进入窗口, 1:tomcat服务注册 执行命令:service.bat install tomcat8.5.100 命令执行成功后,会在注册服务列表出现这个服务,如果…

基于ssm+vue图书管理系统

基于ssmvue图书管理系统 ssm477图书管理系统 相关技术 javassmmysqlvueelementui

CentOS 7 安装 Minio

获取MinIO安装包 下载地址如下:下载地址通过以下命令可直接将安装包下载至服务器 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm安装MinIO rpm -ivh minio-20230809233022.0.0.x86_64.rpm集成Systemd …

索引下推详情-简单入手

一.概念 索引下推(Index Pushdown)MySQL5.6添加的,是一种优化技术,用于在查询执行时将部分计算移动到存储引擎层,从而减少数据传输和计算的开销(减少回表查询次数),提高查询性能。 …

14、类与对象(采用图解方式分析内存结构)①

在idea中创建一个新文件,名称为Hello.java 其中,Hello就是一个类,main是这个类里面的方法,这意味着我们在学习的时候已经在使用类了。 对象和类 一、概念二、⭐内存分配机制分析Ⅰ、基本内存结构⭐⭐Ⅱ、调用类方法的内存分析&am…

使用 Django 显示表中的数据

1、问题背景 当我们使用 Django 进行 Web 开发时,经常需要在 Web 页面上显示数据库中的数据。例如,我们可能需要在一个页面上显示所有用户的信息,或者在一个页面上显示所有文章的标题和作者。那么,如何使用 Django 来显示表中的数…

打包软件注意

1.建个文件夹D:333 /Dalsa_Cameras /cam1 cam2 2. 3.缺的包 4.自动启动.exe exe快捷方式放一起

编程零基础,如何学习Python?

初学者选择Python入手着实是一个不错的方向,入手简单且广泛的运用是它最显著的特色了。 那有几个问题,我想是开始学习Python之前应该了解的, python能做什么? 发展前景与工作机会有哪些? 需要学习哪些内容&#xf…

英国金融时报:波场TRON出席康奈尔大学区块链会议

近日,康奈尔区块链大会的白金赞助商波场TRON在罗斯福岛的康奈尔大学科技校区(Cornell Tech)举办多项活动,消息得到英国金融时报,费加罗报和Benzinga等权威外媒报道,这全面彰显了波场TRON的领导力。大会吸引了包括学生、学者和行业领袖等在内的 800 多名参与者,凸显了波场TRON致…

迅为RK3562开发板专为3562编写10大分类2900+页文档

iTOP-3562开发板采用瑞芯微RK3562处理器,内部集成了四核A53Mali G52架构,主频2GHZ,内置1TOPSNPU算力,RK809动态调频。支持OpenGLES1.1/2.0/3.2、0penCL2.0、Vulkan 1.1内嵌高性能2D加速硬件。 内置独立NPU, 算力达 1TOPS,可用于轻…

MySQL--SQL编程、触发器、存储过程、存储函数、事务

今日目标 SQL编程 触发器 存储过程 存储函数 事务 数据库优化 SQL编程 SQL语法,结构化查询语言,主要用在关系型数据库操作上,但是要注意,SQL语句,是一种编程语言。 是否存在变量 存在程序控制流程(三…

Geotools--生成等值线

好久没用geotools去写东西了&#xff0c;因为近几年一直在接触所谓数字孪生和可视化相关项目&#xff0c;个人的重心也往前端可视化去倾斜&#xff0c;在后端的开发上到变得停滞下来。 这次用的是geotools 28.4版本&#xff0c;生成等值线的方法在 <dependency><group…