如何解决这种情况呢,这里就引入了MRR算法。
MRR算法认识
=======
MRR算法的全称是Multi-Range-Read,它是MySQL 5.6引入的新特性,其目的是为了减少磁盘的随机访问,尽量使用顺序读盘。
上面不是说到回表可能导致大量的随机访问,从而影响性能嘛,MRR的做法简单理解就是先给你ID在内存中先排序,保证ID是递增的,然后再去查询,这样就可以尽可能保证,在读取磁盘时是顺序读取,从而提高性能。
比如上面例子中的范围查询a在区间(10,100)的值,可以分解为下面几个步骤:
-
根据辅助索引a,查询区间(10,100)的所有id,并放入到内存 read_rnd_buffer中;
-
在内存中,将id递增排序;
-
根据顺序,到主键索引中查询数据,并返回结果集。
read_rnd_buffer:由read_rnd_buffer_size 变量定义的内存大小中,默认256K
上面就是MRR的执行过程,它的优势是针对范围查找的语句,可以将大量的主键id排序后,能够保证读取主键索引时是顺序读写,从而提高性能。
如何开启MRR
=======
我们可以通过设置参数来开启MRR
set optimizer_switch=“mrr_cost_based=off”
复制代码
通过执行计划,在Extra中就可以看到,我们已经开启了MRR。
NLJ算法优化
=======
MySQL 5.6引入了Batched Key Access(简称BKA),它是对NLJ算法的一种优化,NLJ算法在上一章我们就已经知道其内部原理了,这里就不再赘述,小伙伴们可以回顾上一篇文章查看。
- NLJ算法
NLJ算法其实效率还是不错的,但是该算法是通过单值来匹配获取结果,那我们能不能同时传递多个值给t2表来查询呢,如今我们学习完上面的MRR,小伙伴们是不是也有一个想法,可以通过MRR的思想对NLJ进行优化呢?
其实BKA确实是基于MRR算法的,观察下面这幅图,查询的时候把驱动表的数据取出部分放入到join_buffer,如果出现join_buffer放不下,就会进行分段策略,然后再执行MRR算法。
如何开启BKA
=======
我们可以通过设置参数来开启BAK,前面两个参数用于设置MRR,因为BAK依赖MRR
set optimizer_switch=‘mrr=on,mrr_cost_based=off,batched_key_access=on’;
复制代码
BNL 算法优化
========
上一章我们学完了BNL算法,也知道该算法的缺点,总结起来可归结以下几点:
-
join过程中需要M*N(M、N为两张表行数)次的对比次数,对于大表这个是相当可怕的。
-
使用 join 语句多次扫描一个冷表,并且这个语句执行时间超过 1 秒,就会在再次扫描冷表的时候,把冷表的数据页移到 LRU 链表头部,从而造成Buffer Pool的热数据被淘汰,影响内存命中率,这段内容后续章节会详细讲解,这里简单了解即可。
对于上面出现的问题,我们最简单的方法就是在被驱动表上新建索引,但是这种方式并不是对所有情况都适合,比如我们例子中,被驱动表中有千万条数据,同时查询的sql又是低频sql,直接添加索引就非常浪费。
还有一种方式我们可以添加一个临时表,大致过程如下:
-
新建临时表temp;
-
将满足条件的数据插入到新表中;
-
将链式表temp添加索引;
-
使用驱动表和临时表temp进行join操作
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)
最后
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
+2021年最新大厂面试题。
[外链图片转存中…(img-FGP2Emki-1713804082586)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!