5大模块带你MySQL图解JOIN算法

本文介绍了MySQL中的MRR算法,一种用于减少磁盘随机访问、提高范围查询性能的技术。文中还讨论了NLJ和BKA算法的优化,以及如何通过设置参数开启这些特性。最后提到了针对特定问题的索引优化策略。
摘要由CSDN通过智能技术生成

如何解决这种情况呢,这里就引入了MRR算法。

MRR算法认识

=======

MRR算法的全称是Multi-Range-Read,它是MySQL 5.6引入的新特性,其目的是为了减少磁盘的随机访问,尽量使用顺序读盘。

上面不是说到回表可能导致大量的随机访问,从而影响性能嘛,MRR的做法简单理解就是先给你ID在内存中先排序,保证ID是递增的,然后再去查询,这样就可以尽可能保证,在读取磁盘时是顺序读取,从而提高性能。

比如上面例子中的范围查询a在区间(10,100)的值,可以分解为下面几个步骤:

轻松上手!5大模块带你MySQL图解JOIN算法

  1. 根据辅助索引a,查询区间(10,100)的所有id,并放入到内存 read_rnd_buffer中;

  2. 在内存中,将id递增排序;

  3. 根据顺序,到主键索引中查询数据,并返回结果集。

read_rnd_buffer:由read_rnd_buffer_size 变量定义的内存大小中,默认256K

上面就是MRR的执行过程,它的优势是针对范围查找的语句,可以将大量的主键id排序后,能够保证读取主键索引时是顺序读写,从而提高性能。

如何开启MRR

=======

我们可以通过设置参数来开启MRR

set optimizer_switch=“mrr_cost_based=off”

复制代码

通过执行计划,在Extra中就可以看到,我们已经开启了MRR。

轻松上手!5大模块带你MySQL图解JOIN算法

NLJ算法优化

=======

MySQL 5.6引入了Batched Key Access(简称BKA),它是对NLJ算法的一种优化,NLJ算法在上一章我们就已经知道其内部原理了,这里就不再赘述,小伙伴们可以回顾上一篇文章查看。

  • NLJ算法

轻松上手!5大模块带你MySQL图解JOIN算法

NLJ算法其实效率还是不错的,但是该算法是通过单值来匹配获取结果,那我们能不能同时传递多个值给t2表来查询呢,如今我们学习完上面的MRR,小伙伴们是不是也有一个想法,可以通过MRR的思想对NLJ进行优化呢?

其实BKA确实是基于MRR算法的,观察下面这幅图,查询的时候把驱动表的数据取出部分放入到join_buffer,如果出现join_buffer放不下,就会进行分段策略,然后再执行MRR算法。

轻松上手!5大模块带你MySQL图解JOIN算法

如何开启BKA

=======

我们可以通过设置参数来开启BAK,前面两个参数用于设置MRR,因为BAK依赖MRR

set optimizer_switch=‘mrr=on,mrr_cost_based=off,batched_key_access=on’;

复制代码

BNL 算法优化

========

上一章我们学完了BNL算法,也知道该算法的缺点,总结起来可归结以下几点:

  1. join过程中需要M*N(M、N为两张表行数)次的对比次数,对于大表这个是相当可怕的。

  2. 使用 join 语句多次扫描一个冷表,并且这个语句执行时间超过 1 秒,就会在再次扫描冷表的时候,把冷表的数据页移到 LRU 链表头部,从而造成Buffer Pool的热数据被淘汰,影响内存命中率,这段内容后续章节会详细讲解,这里简单了解即可。

对于上面出现的问题,我们最简单的方法就是在被驱动表上新建索引,但是这种方式并不是对所有情况都适合,比如我们例子中,被驱动表中有千万条数据,同时查询的sql又是低频sql,直接添加索引就非常浪费。

还有一种方式我们可以添加一个临时表,大致过程如下:

  1. 新建临时表temp;

  2. 将满足条件的数据插入到新表中;

  3. 将链式表temp添加索引;

  4. 使用驱动表和临时表temp进行join操作
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
+2021年最新大厂面试题。
[外链图片转存中…(img-FGP2Emki-1713804082586)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值