当前位置: 首页 > news >正文

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问(Batch Key Access, BKA) 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术,特别是在通过索引进行 JOIN 时,它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行,而不是逐行处理。这种方式可以有效利用数据库的缓存和减少 I/O 开销。

一、BKA 的原理

在传统的 Nested Loop Join(嵌套循环连接)中,MySQL 会逐行处理外部表的每一行,并针对每一行去内部表查找对应的匹配记录。这样会导致很多随机 I/O 操作,从而影响性能。

BKA 改进了这个过程,通过先收集一批外部表的键,然后将这些键一次性发送到存储引擎进行批量查找,这样就减少了内部表的查找次数,从而提升了性能。

二、BKA 的工作流程

  1. 外部表扫描:MySQL 首先从外部表中扫描多行记录,并收集这些记录的键值。
  2. 批量键访问:将这些键值传递给内部表的存储引擎,进行批量的索引查找。
  3. 匹配结果返回:内部表的匹配记录返回给外部表进行连接操作。

三、Java 模拟 BKA 的过程

在 Java 中,我们可以通过模拟数据库表和索引来展示 BKA 的工作流程,假设我们有两个表,outerTableinnerTable,它们之间通过某个键进行关联查询。我们将通过一次性批量获取外部表的键来进行批量查询内部表的记录。

1. 设计思路
  • 我们首先模拟两个表的数据。
  • 实现一个批量键访问的查询流程,通过批量获取外部表的键并查询内部表的匹配记录。
2. Java 代码实现
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;class Record {int id;String data;public Record(int id, String data) {this.id = id;this.data = data;}@Overridepublic String toString() {return "ID: " + id + ", Data: " + data;}
}public class BatchKeyAccessSimulator {// 模拟外部表private List<Record> outerTable = new ArrayList<>();// 模拟内部表private Map<Integer, Record> innerTable = new HashMap<>();// 初始化数据public BatchKeyAccessSimulator() {// 插入外部表数据outerTable.add(new Record(1, "Outer1"));outerTable.add(new Record(2, "Outer2"));outerTable.add(new Record(3, "Outer3"));outerTable.add(new Record(4, "Outer4"));// 插入内部表数据innerTable.put(1, new Record(1, "Inner1"));innerTable.put(2, new Record(2, "Inner2"));innerTable.put(3, new Record(3, "Inner3"));innerTable.put(5, new Record(5, "Inner5")); // 不匹配外部表}// 模拟批量键访问的 JOIN 操作public List<String> batchKeyAccessJoin() {List<String> result = new ArrayList<>();// Step 1: 批量获取外部表的键(ID)List<Integer> outerKeys = new ArrayList<>();for (Record outerRecord : outerTable) {outerKeys.add(outerRecord.id);  // 假设以 ID 作为 JOIN 键}// Step 2: 批量访问内部表,查找对应键的记录Map<Integer, Record> matchedInnerRecords = new HashMap<>();for (Integer key : outerKeys) {if (innerTable.containsKey(key)) {matchedInnerRecords.put(key, innerTable.get(key)); // 内部表的匹配记录}}// Step 3: 将外部表和内部表的数据进行关联并返回for (Record outerRecord : outerTable) {if (matchedInnerRecords.containsKey(outerRecord.id)) {Record innerRecord = matchedInnerRecords.get(outerRecord.id);result.add("Outer: " + outerRecord + " <-> Inner: " + innerRecord);} else {result.add("Outer: " + outerRecord + " <-> No Match");}}return result;}public static void main(String[] args) {BatchKeyAccessSimulator simulator = new BatchKeyAccessSimulator();// 运行批量键访问的 JOIN 操作List<String> joinResult = simulator.batchKeyAccessJoin();// 输出 JOIN 结果for (String record : joinResult) {System.out.println(record);}}
}

四、代码解析

  1. 外部表和内部表的设计

    • outerTable 是模拟的外部表,存储一组记录。
    • innerTable 是模拟的内部表,用 HashMap 来模拟索引,其中键为 id,值为对应的记录。
  2. 批量键访问的实现

    • batchKeyAccessJoin() 方法模拟了批量键访问的过程。
    • 首先批量收集外部表的键(即 id)。
    • 然后通过这些键批量查找内部表中匹配的记录,并将外部表和内部表的数据进行关联。
  3. 运行结果
    输出结果展示了批量键访问的 JOIN 操作:

    Outer: ID: 1, Data: Outer1 <-> Inner: ID: 1, Data: Inner1
    Outer: ID: 2, Data: Outer2 <-> Inner: ID: 2, Data: Inner2
    Outer: ID: 3, Data: Outer3 <-> Inner: ID: 3, Data: Inner3
    Outer: ID: 4, Data: Outer4 <-> No Match
    

    可以看到,outerTable 中的记录与 innerTable 中的记录根据 id 进行了关联,第四条记录在内部表中没有匹配的记录。

五、BKA 的优点和适用场景

优点
  1. 减少随机 I/O:传统的嵌套循环连接会对每个外部表的记录进行一次内部表查询,导致大量的随机 I/O 操作,而 BKA 技术通过批量查找减少了随机 I/O。
  2. 提高缓存利用率:BKA 可以让存储引擎将一批键的相关记录加载到缓存中,从而更好地利用缓存,提升查询效率。
适用场景
  1. 大表连接查询:在进行大表连接时,BKA 能够减少随机 I/O 提高性能。
  2. 索引存在的情况下:当内部表有合适的索引时,BKA 可以充分利用索引进行高效的批量查找。

六、BKA 的缺点

  1. 批量大小控制:如果批量大小选择不合适,可能会导致过多的数据加载到内存中,反而影响性能。
  2. 适用索引情况:BKA 主要适用于索引存在的场景,如果内部表没有合适的索引,效果会大打折扣。

七、总结

  • 批量键访问(BKA) 是一种 MySQL 优化技术,通过批量收集外部表的键并一次性查找内部表的匹配记录,从而减少随机 I/O,提升查询性能。
  • 在 Java 中,我们通过模拟外部表和内部表的关联查询展示了 BKA 的工作原理。
  • 该技术在大表 JOIN 查询和存在索引的情况下能显著提高性能,但需要合理控制批量大小以避免内存开销过大。

相关文章:

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问&#xff08;Batch Key Access, BKA&#xff09; 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术&#xff0c;特别是在通过索引进行 JOIN 时&#xff0c;它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…...

912.排序数组(归并排序)

目录 题目解法初始数组1. 分解阶段2. 合并阶段结果 为什么要创建长整型ll mid l ((r - l) >> 1);其中的>>是什么意思 题目 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O…...

使用 cmake 在 x86 系统中为 arm 系统交叉编译程序

原理&#xff1a; 在 x86 系统里使用交叉编译工具链&#xff08;arm 版 gcc/g&#xff09;编译程序&#xff0c;然后放在 arm 系统里运行。 arm 版本 使用 lscpu 查看 cpu 架构 版本说明armv732 bitarmv8/arrch6464 bit 安装交叉编译工具链 # 针对 armv7 sudo apt install…...

软考(网工)——网络规划设计

文章目录 &#x1f550;综合布线1️⃣结构化布线系统2️⃣综合布线六大子系统3️⃣综合布线物理结构图 &#x1f551;网络分析与设计1️⃣网络规划设计模型2️⃣网络流量分析3️⃣网络安全技术措施表4️⃣技术评价 &#x1f552;网络结构与功能1️⃣局域网结构类型2️⃣三层架构…...

即插即用特征融合模块,即用即涨点!

特征融合&#xff08;Feature Fusion&#xff09;是深度学习中的一种重要技术&#xff0c;它可以帮助模型更好地理解数据的内在结构和规律&#xff0c;提高模型的性能和泛化能力。 另外&#xff0c;特征融合还可以提高模型的分类准确率&#xff0c;减少过拟合风险&#xff0c;…...

蓝桥算法双周赛 第 19 场 小白入门赛

打开石门 只要有相连的一样字母就可以消成一个 string s; int ans;void solve() {cin >> s;int len 0;for (int i 0;i < s.size();i ){if (s[i] L) len ;else //遇到Q{ans (len ? 1 : 0); //消除累计的Llen 0;ans ;//遇到Q}}//QLLLL时,最后遇不到Q让累计的L消…...

Cursor零基础小白教程系列「进阶」 - Cursor 智能代码补全详解(Tab)

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 Cursor 智能代码补全详解(Tab) 概述 Cursor的智能代码补全&#xff0c;也就是快捷键Tab&#xff0c;是其最强大和独特的AI辅助编程工具之一。本教程将详细介绍…...

数据结构《顺序表》

文章目录 前言一、什么是顺序表&#xff1f;1.1 顺序表的概念1.2 顺序表的建立 二、MyArrayList的实现三、顺序表的方法四、关于顺序表的例子总结 前言 提示&#xff1a;这里涉及到的ArrayList类是一个泛型类&#xff0c;同时后面的很多内容都会涉及到泛型&#xff0c;如果不了…...

视频分享网站毕业设计基于SpringBootSSM框架

目录 1.摘要 2.引言 2.1 研究意义 3 功能描述 3.1‌功能图展示 ‌3.2非功能需求‌ 4. 需求分析 4.1前端技术 4.2后端技术 4.3视频处理技术 4.4内容分发网络&#xff08;CDN&#xff09; 4.5其他关键技术 计算机毕业设计/springboot/javaWEB/J2EE/MYSQL数据库/vue前后…...

Python多进程学习与使用:全面指南

Python多进程学习与使用&#xff1a;全面指南 目录 引言什么是多进程&#xff1f;为什么使用多进程&#xff1f;Python中的多进程模块&#xff1a;multiprocessing创建进程的基本方法进程间通信进程池多进程与多线程的比较常见问题和解决方案最佳实践和性能优化实战项目&…...

HTTP Proxy环境下部署Microsoft Entra Connect和Health Agents

在企业环境中&#xff0c;时常需要通过使用HTTP Proxy访问Internet&#xff0c;在使用HTTP Proxy访问Internet的环境中部署Microsoft Entra Connect和Microsoft Entra Connect Health Agents可能会遇到一些额外的配置步骤&#xff0c;以便这些服务能够正常连接到Internet。 一…...

基于单片机的 OLED 显示终端设计分析与研究

摘要: 我国的经济发展速度正在不断加快,经济体制也在经历着一系列的改革,工业发展也正是受到了它的影响,逐步发生变化。在这样的背景下,传统的 LCD 显示技术,逐渐被显示效果更好,功耗更低的 OLED 代替。本文主要介绍了基于单片机的 OLED 显示终端设计,该设计目前具有很…...

基于Multisim压力报警器电路设计(含仿真和报告)

【全套资料.zip】压力报警器电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 压力报警器包括:压力检测、信号放大、声光报警当电路检测到系统压力正常时&#xff0c;不进行声、光报…...

基于Springboot的在线考试与学习交流平台的设计与实现

基于Springboot的在线考试与学习交流平台 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https://download.csdn.net/downlo…...

“避免序列化灾难:掌握实现 Serializable 的真相!(二)”

文章目录 一、什么是序列化&#xff1f;二、Serializable 是如何起作用的&#xff1f;三、为什么不自动序列化所有对象&#xff1f;四、Java 序列化的底层原理序列化的核心步骤&#xff1a; 五、反序列化的原理六、总结&#xff1a;为什么必须实现 Serializable 才能序列化&…...

中国工商银行智能运维体系建设

随着信息技术的快速发展,分布式架构已经成为主流的系统架构形式。基于分布式架构的系统具有资源利用率高、可扩展性好等优点,已广泛应用于各类企业信息系统之中。分布式监控系统应运而生,它通过在各个节点部署轻量级代理程序,实现对分布式系统的监控数据采集和分析,有效地解决…...

如何将logism电路转为verilog(一)

好长时间没写博客了 下文中提到的文件可在此仓库下载&#xff1a;https://github.com/deadfffool/HUST-Computer-Organization-Big-Homework/tree/main 在转换为verilog之前&#xff0c;需要对logisim电路做以下几点改动&#xff1a; 首先将下载的logisim_change.jar放在与log…...

【论文笔记】X-Former: Unifying Contrastive and Reconstruction Learning for MLLMs

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: X-Former: Unifying Contr…...

带权并查集注意事项

食物链 #include<bits/stdc.h> using namespace std; const int N5e410; int p[N],d[N]; int find(int x) {if(p[x]!x){int rootfind(p[x]);d[x]d[p[x]];p[x]root;}return p[x]; } int main() {int n,k;cin>>n>>k;for(int i1;i<n;i)p[i]i;int ans0;while…...

No.18 笔记 | XXE(XML 外部实体注入)漏洞原理、分类、利用及防御整理

一、XXE 漏洞概述 &#xff08;一&#xff09;定义 XXE&#xff08;XML 外部实体注入&#xff09;漏洞源于 XML 解析器对外部实体的不当处理&#xff0c;攻击者借此注入恶意 XML 实体&#xff0c;可实现敏感文件读取、远程命令执行和内网渗透等危险操作。 &#xff08;二&am…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...