MySQL Join 优化
MySQL Join的使用
一、使用join语句的优势?
使用join语句,性能比强行拆成多个单表执行SQL语句的性能要好;
使用join语句的话,需要让
小表做驱动表
;前提是,“可使用被驱动表的索引”
二、怎么选择驱动表?
在join语句执行过程中,驱动表是走全表扫面,而被驱动表是走树搜索(需建立索引);
使用小表做驱动表;
三、什么是MRR?
Multi-Range-Read 优化(MRR),这个优化的主要目的是尽量使用顺序读盘
;
因为大多数的数据都是按照主键递增顺序插入得到的,所以我们可以认为,如果按照主键的递增顺序查询的话,对磁盘的读比较接近顺序读,能够提升读性能;
假设,执行此语句,MRR优化的设计思路,执行流程:
select * from t1 where a>=1 and a<=100;
根据索引 a,定位到满足条件的记录,将id值放入read_rnd_buffer中;
将read_rnd_buffer 中的id进行递增排序;
排序后的id数组,依次到主键id索引中查记录,并作为结果返回;
read_rnd_buffer的大小是由read_rnd_buffer_size参数控制的,若步骤 1 read_rnd_buffer存满了,就会先执行完步骤2、3,然后情况read_rnd_buffer,之后继续招索引a的下个记录,并继续循环;
稳定使用MRR优化的话,需要设置set optimizer_switch=“mrr_cost_based=off”
文档说,是现在的优化器策略,判断消耗的时候,会更倾向于不使用MRR,把mrr_cose_based设置为off,就是固定使用MRR了
总结:
MRR提升性能的核心:能够再索引 a 上做范围查询,得到足够多的主键,完成排序后再回表,体现出顺序性的优势。
四、优化:
1.NLJ优化:
从驱动表t1,一行行的取出 a 的值,再到被驱动表t2去join,此时没有利用到MRR的优势
;
如果可以使用
Index Nested-Loop join
算法,应该选择小表做驱动表,可以用被驱动表上的索引,其实是没问题的;
2.BKA优化:
Batched Key Access
,是MySQL 5.6引入的对Index Nested-Loop Join
(NLJ
)的优化。
BKA优化的思路,复用了
join_buffer
在BNL算法中,利用了
join_buffer
来暂存驱动表的数据,在NLJ里面并没有利用到join_buffer
在
join_buffer
中放入的数据为P1~P100,表示只会取查询所需要的字段;如果
join_buffer
放不下P1~P100,就会将这100行数据分成多段执行
启用:
BKA算法依赖于MRR
SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';
3.BNL优化:
- 可能会多次扫描被驱动表,占用磁盘IO资源;
- 判断Join条件需要执行M∗NM∗N次对比,如果是大表会占用非常多的CPU资源;
- 可能会导致Buffer Pool的热数据被淘汰和正常的业务数据无法成为热数据,进而影响内存命中率;
注意:如果优化器选择了BNL
算法,就需要做优化:
- 给被驱动表Join字段加索引,把
BNL
算法转换成BKA
算法; - 临时表;
五、怎么优化join语句?
NLJ、BNL的优化方法:
- BKA算法是对NLJ算法的优化,一次取出一批数据的字段到join_buffer中,然后批量join;
- BKA算法依赖于MRR,因为批量join找到被驱动表的非聚集索引字段通过MRR去查找行数据;
- BKA优化是MySQL已经内置支持的,建议默认使用;
- BNL算法效率低,建议都尽量转成BKA算法,优化的方向就是给被驱动表的关联字段加上索引;
参考资料:
《MySQL 实战45讲》
MySQL Join 优化相关推荐
- MySQL第9天:MySQL索引优化分析之join查询
MySQL索引优化分析之join查询 #编写时间:2017.3.12 #编写地点:广州 常见join查询: 1.SQL执行顺序:手写.机读.总结 (1)手写 (2)机读 (3)总结 2.join图 3 ...
- left join 索引失效无条件_技术分享 | MySQL 优化:JOIN 优化实践
近期刚好学习了丁奇老师的<MySQL 实战 45 讲>中的 join 优化相关知识,又刚刚好碰上了一个非常切合的 join 查询需要优化,分析过程有些曲折,记录下来留作笔记.问题 SQL ...
- MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?...
最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...
- MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?
最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...
- MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)
MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization) 如需转载请标明出处:http://blog.csdn.net/it ...
- mysql join order by_MySQL 14 慢查询优化join、order by、group by
1.慢查询的优化思路 1.1优化更需要优化的SQL 优化SQL是有成本的 高并发低消耗的比低并发高消耗影响更大 优化示例 并发形式 优化前 假设优化后 高并发低消耗 每小时10000次,每次20个IO ...
- MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...
为什么80%的码农都做不了架构师?>>> 文章简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11实战考验,积累了7年对阿 ...
- 记一次mysql性能优化过程
2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...
- MySQL JOIN原理
为什么80%的码农都做不了架构师?>>> 最近被公司某一开发问道JOIN了MySQL JOIN的问题,细数之下发下我对MySQL JOIN的理解并不是很深刻,所以也查看了很多文档,最 ...
- MySQL性能优化速记
MySQL性能优化速记http://www.bieryun.com/3064.html 总结自<MySQL 5.7从入门到精通(视频教学版)>刘增杰编著. 优化简介 MySQL数据库优化是 ...
最新文章
- linux 查找 jdk 安装路径
- Nginx会话保持之nginx-sticky-module模块
- prefixspan是挖掘频繁子序列,子序列不一定是连续的,当心!!!
- 如何清除windows安全中心病毒和威胁防护的保护历史记录
- 说说你对binlog、redo log和undo log的理解
- 七十七、 二叉树的层次遍历和最大深度
- 高光谱地物识别练习-从ENVI标准波普库中选择端元进行物质识别
- changedate.js
- HDU4812 D tree 【点分治 + 乘法逆元】
- 【UVA10603】Fill(优先队列+状态转移)
- 锐捷虚拟机做服务器,笨方法解决锐捷校园网环境下VMware虚拟机无法上网问题(Fedora试用上网成功)...
- 科研笔记2:科技论文作图规范
- Spring Boot学习8——Redis
- Android总结(1-3章)
- MAC install torch
- 北京2022年高考数学题纯手工排版
- CentOS opera 浏览器
- 有赞android电话面试,挖财 / 有赞电话面试 题目分享
- mybatis-plus对sqlserver数据库进行逆向工程
- 利用火狐浏览器的adblock plus插件,隐藏影响你视线的元素