当前位置: 首页 > 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…...

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…...

【毕业设计】基于SpringBoot的网上商城系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;非常合适作为大学的毕业设计&#xff0c;难以适中。 &#x1f525;采用技术&#xff1a;Sp…...

【GIT】.gitignore文件的使用

使用 Visual Studio 开发项目&#xff0c;并使用 Git 将项目推送到 GitLab 时&#xff0c;有一些文件是自动生成的、特定于开发环境的文件&#xff0c;通常不应该被推送到远程仓库。这就是 .gitignore 文件的作用&#xff0c;它可以告诉 Git 忽略这些文件或文件夹。 1. 哪些文…...

【Qt】控件——Qt多元素控件、常见的多元素控件、多元素控件的使用、List Widget、Table Widget、Tree Widget

文章目录 QtQt多元素控件List WidgetTable WidgetTree Widget Qt Qt多元素控件 List Widget 使用 QListWidget 能够显示一个纵向的列表。 属性说明currentRow当前被选中的是第几行。count一共有多少行。sortingEnabled是否允许排序。isWrapping是否允许换行。itemAlignment元素…...

【图论】(五)最短路径算法(D / BF / SPFA / F / A*)

最短路径算法&#xff08;D / BF / SPFA / F / A*&#xff09; 1. 最短路径之dijkstra&#xff08;D算法&#xff09;思路模拟过程程序实现拓展 2. dijkstra算法堆优化思路程序实现 3. Bellman_ford 算法&#xff08;BF算法&#xff09;松弛模拟过程拓展 4. Bellman_ford 队列优…...

Scala中的reduce

作用&#xff1a;reduce是一种集合操作&#xff0c;用于对集合中的元素进行聚合操作&#xff0c;返回一个单一的结果。它通过指定的二元操作&#xff08;即取两个元素进行操作&#xff09;对集合中所有的元素进行递归处理&#xff0c;并最终将其合并为一个值。 语法&#xff1…...

调查显示软件供应链攻击增加

OpenText 发布了《2024 年全球勒索软件调查》&#xff0c;强调了网络攻击的重要趋势&#xff0c;特别是在软件供应链中&#xff0c;以及生成式人工智能在网络钓鱼诈骗中的使用日益增多。 尽管各国政府努力加强网络安全措施&#xff0c;但调查显示&#xff0c;仍有相当一部分企…...

JMeter使用不同方式传递接口参数

1、使用 HTTP 请求中的参数&#xff1a; 在 JMeter 的测试计划中&#xff0c;添加一个 "HTTP 请求" 元件。 在 "HTTP 请求" 元件的参数化选项中&#xff0c;可以添加参数的名称和值。可以手动输入参数&#xff0c;也可以使用变量来传递参数值。 如果要使…...

《C++开发 AR 游戏:开启未来娱乐新潮流》

一、引言 在当今科技飞速发展的时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正以惊人的速度改变着我们的生活和娱乐方式。从智能手机上的 AR 滤镜到沉浸式的 AR 游戏&#xff0c;这项技术的应用越来越广泛。而在众多编程语言中&#xff0c;C以其高效、强大的性能在…...

列表、元组、集合、字典和 pandas 数据框(DataFrame)之间的数据转换

二、列表、元组、集合、字典和 pandas 数据框&#xff08;DataFrame&#xff09;之间的数据转换 在 Python 中&#xff0c;列表、元组、集合、字典和 pandas 数据框&#xff08;DataFrame&#xff09;是常见的数据结构&#xff0c;它们可以通过多种方式相互转换。每种数据结构…...