MySQL Join的使用

一、使用join语句的优势?

  1. 使用join语句,性能比强行拆成多个单表执行SQL语句的性能要好;

  2. 使用join语句的话,需要让小表做驱动表

    前提是,“可使用被驱动表的索引”

二、怎么选择驱动表?

在join语句执行过程中,驱动表是走全表扫面,而被驱动表是走树搜索(需建立索引)

使用小表做驱动表;

三、什么是MRR?

Multi-Range-Read 优化(MRR),这个优化的主要目的是尽量使用顺序读盘

因为大多数的数据都是按照主键递增顺序插入得到的,所以我们可以认为,如果按照主键的递增顺序查询的话,对磁盘的读比较接近顺序读,能够提升读性能;

假设,执行此语句,MRR优化的设计思路,执行流程:

select * from t1 where a>=1 and a<=100;
  1. 根据索引 a,定位到满足条件的记录,将id值放入read_rnd_buffer中;

  2. 将read_rnd_buffer 中的id进行递增排序;

  3. 排序后的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 JoinNLJ)的优化。

  1. BKA优化的思路,复用了join_buffer

  2. 在BNL算法中,利用了join_buffer来暂存驱动表的数据,在NLJ里面并没有利用到join_buffer

  3. 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优化:

  1. 可能会多次扫描被驱动表,占用磁盘IO资源
  2. 判断Join条件需要执行M∗NM∗N次对比,如果是大表会占用非常多的CPU资源
  3. 可能会导致Buffer Pool的热数据被淘汰正常的业务数据无法成为热数据,进而影响内存命中率

注意:如果优化器选择了BNL算法,就需要做优化:

  1. 给被驱动表Join字段加索引,把BNL算法转换成BKA算法;
  2. 临时表;

五、怎么优化join语句?

NLJ、BNL的优化方法:

  1. BKA算法是对NLJ算法的优化,一次取出一批数据的字段到join_buffer中,然后批量join;
  2. BKA算法依赖于MRR,因为批量join找到被驱动表的非聚集索引字段通过MRR去查找行数据;
  3. BKA优化是MySQL已经内置支持的,建议默认使用;
  4. BNL算法效率低,建议都尽量转成BKA算法,优化的方向就是给被驱动表的关联字段加上索引;

参考资料:

《MySQL 实战45讲》

MySQL Join 优化相关推荐

  1. MySQL第9天:MySQL索引优化分析之join查询

    MySQL索引优化分析之join查询 #编写时间:2017.3.12 #编写地点:广州 常见join查询: 1.SQL执行顺序:手写.机读.总结 (1)手写 (2)机读 (3)总结 2.join图 3 ...

  2. left join 索引失效无条件_技术分享 | MySQL 优化:JOIN 优化实践

    近期刚好学习了丁奇老师的<MySQL 实战 45 讲>中的 join 优化相关知识,又刚刚好碰上了一个非常切合的 join 查询需要优化,分析过程有些曲折,记录下来留作笔记.问题 SQL ...

  3. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?...

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  4. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?

    最近无意间看到一个 MySQL 分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案.因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的 ...

  5. MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization)

    MySQL查询优化之七-左Join 和右Join 优化(Left Join and Right Join Optimization) 如需转载请标明出处:http://blog.csdn.net/it ...

  6. mysql join order by_MySQL 14 慢查询优化join、order by、group by

    1.慢查询的优化思路 1.1优化更需要优化的SQL 优化SQL是有成本的 高并发低消耗的比低并发高消耗影响更大 优化示例 并发形式 优化前 假设优化后 高并发低消耗 每小时10000次,每次20个IO ...

  7. MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...

    为什么80%的码农都做不了架构师?>>>    文章简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11实战考验,积累了7年对阿 ...

  8. 记一次mysql性能优化过程

    2019独角兽企业重金招聘Python工程师标准>>> 转发自:记一次mysql性能优化过程 由于配置是运行过那么长时间,很稳定,基本上不考虑,所以本次主要是sql的优化,并且集中在 ...

  9. MySQL JOIN原理

    为什么80%的码农都做不了架构师?>>> 最近被公司某一开发问道JOIN了MySQL JOIN的问题,细数之下发下我对MySQL JOIN的理解并不是很深刻,所以也查看了很多文档,最 ...

  10. MySQL性能优化速记

    MySQL性能优化速记http://www.bieryun.com/3064.html 总结自<MySQL 5.7从入门到精通(视频教学版)>刘增杰编著. 优化简介 MySQL数据库优化是 ...

最新文章

  1. linux 查找 jdk 安装路径
  2. Nginx会话保持之nginx-sticky-module模块
  3. prefixspan是挖掘频繁子序列,子序列不一定是连续的,当心!!!
  4. 如何清除windows安全中心病毒和威胁防护的保护历史记录
  5. 说说你对binlog、redo log和undo log的理解
  6. 七十七、 二叉树的层次遍历和最大深度
  7. 高光谱地物识别练习-从ENVI标准波普库中选择端元进行物质识别
  8. changedate.js
  9. HDU4812 D tree 【点分治 + 乘法逆元】
  10. 【UVA10603】Fill(优先队列+状态转移)
  11. 锐捷虚拟机做服务器,笨方法解决锐捷校园网环境下VMware虚拟机无法上网问题(Fedora试用上网成功)...
  12. 科研笔记2:科技论文作图规范
  13. Spring Boot学习8——Redis
  14. Android总结(1-3章)
  15. MAC install torch
  16. 北京2022年高考数学题纯手工排版
  17. CentOS opera 浏览器
  18. 有赞android电话面试,挖财 / 有赞电话面试 题目分享
  19. mybatis-plus对sqlserver数据库进行逆向工程
  20. 利用火狐浏览器的adblock plus插件,隐藏影响你视线的元素

热门文章

  1. 【转】当我们说“区块链是无需信任的”,我们的意思是
  2. idou老师教你学Istio11 : 如何用Istio实现流量熔断
  3. 致凯利定理(Cayley公式)
  4. MongoDB和MySQL常用增删改查语句
  5. 实用的Google搜索技巧
  6. 稀土铕Eu-ps微球|聚苯乙烯荧光微球-红色荧光100nm~500nm
  7. javascript中数据类型转换为Number
  8. VOT数据集自动/手动下载
  9. VOT测试自己的数据集
  10. 上小学的划片政策(by quqi99)