前言

MRR全称:Multi-Range Read,中文翻译过来就是多范围读取,主要解决的是当二级索引取出索引值后再去聚集索引中取行可能会造成大量的磁盘随机IO的问题,下面我们来具体进行分析。

Index Nested-Loop Join

在了解MRR前,我们先看一下什么是Index Nested-Loop Join(简称NLJ),直接翻译过来嵌套循环连接,就和我们平时写嵌套循环的思路是一样的,外层循环一个一个的去数,然后与内层循环挨个匹配。

假设要使用以下连接类型执行三个表t1、t2和 之间 t3的连接:

Table   Join Type
t1      range
t2      ref
t3      ALL

如果使用简单的 NLJ 算法,则连接的处理方式如下:

for each row in t1 matching range {for each row in t2 matching reference key {for each row in t3 {if row satisfies join conditions, send to client}}
}

Index Nested-Loop Join的问题

可以看出由于 NLJ 算法一次将一行从外循环传递到内循环,因此它通常会多次读取在内循环中处理的表。并且如果内循环中处理的表没有索引,那将会更加糟糕,所以又出现了Block Nested-Loop Join(简称BNL)优化,关于BNL在MySQL中的Block Nested Loop优化分析这篇文章中有具体分析。

NLJ、BNL共性问题

那无论是NLJ还是BNL都会存在一个问题,就是在匹配内循环表时,是按照外循环表传入的值来匹配,那很明显这样就会存在磁盘随机IO的问题。

磁盘随机IO案例

CREATE TABLE `t3`  (`id` int(11) NOT NULL,`a` int(11) NULL DEFAULT NULL,`b` int(11) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `a`(`a`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

插入一批数据,id不断递增到1000,a从1000递减到1

执行计划分析

EXPLAIN  select * from t3 where a > 100 and a < 500;

正常情况下,执行

select * from t3 where a > 100 and a < 500;

会根据索引a以此取出101,然后回表到聚集索引中查询,对应的索引id为900,很明显这是一次磁盘随机IO的读取,那么完成a > 100 and a < 500范围的搜索,就会回表查询产生499次磁盘随机IO。

MRR优化

MRR优化的目的就是减少磁盘随机IO的产生,其查询优化过程大致如下:

1、先把通过二级索引取出的值缓存在缓冲区中。
2、再把这部分缓冲区中的数据按照ID进行排序。
3、然后再依次根据ID去聚集索引中获取整个数据行。

可以看出,只需要通过一次排序,就使得随机IO,变为顺序IO,使得数据访问更加高效。

read_rnd_buffer_size控制了数据能放入缓冲区的大小,如果一次性不够放就会分多次完成。

MySQL中的MRR优化分析相关推荐

  1. mysql中查询缓存优化以及慢查询

    1. 概述 开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存 2. 操作流程 1.客户端发送 ...

  2. mysql中order by优化的那些事儿

    为了测试方便和直观,我们需要先创建一张测试表并插入一些数据: CREATE TABLE `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记 ...

  3. MYSQL高级篇-----索引优化分析

    索引优化分析 下面是目录可跳转对应页面学习: 2. 索引优化分析 2.1 原因 SQL执行顺序 2.2 常见通用的join查询 2.3 索引 2.3.1 索引分类(重点) 2.3.2 索引结构 2.3 ...

  4. Mysql中慢SQL的分析与优化

    为何对慢SQL进行治理 从数据库角度看:每个SQL执行都需要消耗一定I/O资源,SQL执行的快慢,决定资源被占用时间的长短.假设总资源是100,有一条慢SQL占用了30的资源共计1分钟.那么在这1分钟 ...

  5. [转]Mysql中的SQL优化与执行计划

    From : http://religiose.iteye.com/blog/1685537 一,如何判断SQL的执行效率? 通过explain 关键字分析效率低的SQL执行计划. 比如: expla ...

  6. Mysql中慢查询语句分析

    序言 学习方法这是大部分人都可以掌握的,但是学习的驱动力可能每个人都不太相同.有的人是真正的热爱,有的人是为生活所迫,而有的人是为了证明自己. 我不算是一个热爱编程的人,至少之前一直不算是,对于自己的 ...

  7. Mysql原理及索引优化分析

    一.Mysql索引数据结构 (https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 数据结构可视化) 1.二叉树 特点:二叉树, ...

  8. MySQL高级 - 案例 - 系统性能优化分析

    系统中用户访问日志的数据量,随着时间的推移,这张表的数据量会越来越大,因此我们需要根据业务需求,来对日志查询模块的性能进行优化. 1) 分页查询优化 由于在进行日志查询时,是进行分页查询,那也就意味着 ...

  9. 关于MySQL中复合索引优化

    最近对两个开源系统进行反向工程ER图生成后,对比发现一个系统其中一个表中的复合索引的列个数对查询的效率有较大的影响~~ 于是上网查了下相关的资料:(关于复合索引优化的) 两个或更多个列上的索引被称作复 ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task19. 相同的树
  2. Android学习笔记43:XML文件解析(Pull方式)
  3. java 打印空心菱形,用for循环打印出空心菱形程序
  4. python生成日历书上哪里错了_python生成日历 - osc_a5pzxo31的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 终端通过两台路由器相互通信(静态路由设置)
  6. Event-based Vision: A Survey——论文阅读笔记
  7. caffe的python接口学习(8):caffemodel中的参数及特征的抽取
  8. leetcode 260. Single Number III | 260. 只出现一次的数字 III(位运算:分组异或)
  9. 记一次从代码审计到拿下内网edr的过程
  10. RabbitMQ初识
  11. 十种最受前辈宠爱的职场新人
  12. PHP中require(),include(),require_once()和include_once()有什么区别
  13. [转]Redis几个认识误区
  14. 致远V8.1 协同 最新版
  15. NVR和DVR有什么区别
  16. 关于MATLAB的saveas函数错误
  17. java设置连接超时_HttpClient设置连接超时时间
  18. 2019TFE计算机科学排名,2019TFE美国会计专业研究生排名前50
  19. 多模态机器学习入门——文献阅读(一)Multimodal Machine Learning: A Survey and Taxonomy
  20. 学生管理系统课程设计

热门文章

  1. App 应用测试方法以及测试思路
  2. 微信小程序开发和网页Web开发的区别
  3. 江苏大学计算机学院在校生,江苏大学计算机科学与通信工程学院
  4. Linux下黑白棋c语言程序,黑白棋的c语言代码
  5. odoo中接口开发之jsonrpc
  6. Redis实战 - 09 Redis BitMaps 实现用户签到,统计签到次数,统计签到情况等功能
  7. EXCEL电子表格简单字典功能
  8. 高考志愿填报网站服务器,高考志愿填报系统设计方案.doc
  9. C#往excel中插入特殊符号——HSSFRichTextString
  10. 2021-2027全球与中国手机售票软件市场现状及未来发展趋势