支持Multi Range Read索引优化

原文:http://book.51cto.com/art/201701/529465.htm

http://book.51cto.com/art/201611/521479.htm

《MySQL管理之道:性能调优、高可用与监控(第2版)》第2章MySQL 5.7与MariaDB 10.1的新特性,本章主要讲解MySQL 5.7 和 InnoDB 的一些增强性能,这些增强性能极大地提高了系统和MySQL的性能。下面将详细介绍每一个关键的增强性能及其实现过程。本节为大家介绍支持Multi Range Read索引优化。

作者:贺春旸来源:机械工业出版社|2017-01-23 19:11

2.7.7 支持Multi Range Read索引优化

对大表(基于辅助索引)进行范围扫描时,会导致产生许多随机I/O。而对于普通磁盘来说,随机I/O的性能很差,会遇到瓶颈,在MySQL 5.6/5.7和MariaDB 5.3/5.5/10.0/10.1版本里对这种情况进行了优化,一个新的名词Multi Range Read(MRR)出现了,优化器会先扫描索引,然后收集每行的主键,并对主键进行排序,此时就可以用主键顺序访问基表,即用顺序I/O代替随机I/O。

未开启MRR时,在explain中看到的情况如图2-127所示。

查询i2>2000 and i2<4000记录时,未开启MRR会产生随机I/O,如图2-128所示。

开启MRR后,在explain中看到的情况如图2-129所示。

查询i2>2000和i2<4000记录时,已开启MRR,故会对主键排序,将随机I/O转换为顺序I/O,从而提高数据库的整体性能,如图2-130所示。

针对这两种情况进行对比测试,分别如图2-131和图2-132所示。

从图2-131和图2-132中可以明显看到未开启MRR耗时更长,为1分47秒,开启MRR耗时为0.34秒。

Multi Range Read索引优化在MySQL 5.7版本中默认开启,可以通过语句show variables like 'optimizer_switch'\G;来查看:

  1. mysql> show variables like 'optimizer_switch'\G;
  2. *************************** 1. row ***************************
  3. variable_name: optimizer_switch
  4. Value: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=on,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on
  5. 1 row in set (0.00 sec)

Multi Range Read索引优化在MariaDB 10.1版本中默认是关闭的,可以通过语句show variables like 'optimizer_switch'\G;来查看:

  1. Variable_name: optimizer_switch
  2. Value: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=on,loosescan=on,materialization=on,in_to_exists=on,semijoin=on,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=on,semijoin_with_cache=on,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,table_elimination=on,extended_keys=on,exists_to_in=on

动态开启MRR的命令如下:

    1. set global optimizer_switch='mrr=on,mrr_cost_based=on,mrr_sort_keys=on';
    2. set global mrr_buffer_size = 32*1024*1024;

(转)支持Multi Range Read索引优化的更多相关文章

  1. MySQL 索引优化全攻略

    所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找.而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...

  2. Mysql 索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  3. mysql索引优化比普通查询速度快多少

    mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...

  4. mySql索引优化分析

    MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...

  5. MySQL索引优化详解

    MySQL存储引擎简介 查看命令 a. 查看所使用的MySQL现在已提供什么存储引擎: mysql> show engines; b. 查看所使用的MySQL当前默认的存储引擎: mysql&g ...

  6. MySQL高级第二章——索引优化分析

    一.SQL性能下降原因 1.等待时间长?执行时间长? 可能原因: 查询语句写的不行 索引失效(单值索引.复合索引) CREATE INDEX index_user_name ON user(name) ...

  7. Mysql优化(出自官方文档) - 第八篇(索引优化系列)

    目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...

  8. MySQL高级学习笔记(四):索引优化分析

    文章目录 性能下降 SQL慢 执行时间长 等待时间长 查询语句写的烂 查询数据过多 关联了太多的表,太多join 没有利用到索引 单值 复合 服务器调优及各个参数设置(缓冲.线程数等)(不重要DBA的 ...

  9. mysql 索引优化 性能调优 锁

    1 检查mysql 是否安装 rpm -qa|grep -i mysql 2 ntsysv 查看和设置开机启动列表 3 mysql 在 centos 上默认 的数据目录是 /var/lib/mysql ...

随机推荐

  1. scrapy windows 安装

    windows 7 系统下参照官网安装总是会提示出错,现在整理一下安装的流程 1.安装 python 2.7,添加环境变量 C:\Python27\;C:\Python27\Scripts\; 在 C ...

  2. 201709011工作日记--Volley源码详解(三)

    1. RequestQueue类 我们使用 Volley 的时候创建一个 request 然后把它丢到 RequestQueue 中就可以了.那么来看 RequestQueue 的构造方法,含有四个参 ...

  3. Selenium2+python自动化之读取Excel数据(xlrd)

    前言 当登录的账号有多个的时候,我们一般用excel存放测试数据,本节课介绍,python读取excel方法,并保存为字典格式. 一.环境准备 1.先安装xlrd模块,打开cmd,输入pip inst ...

  4. Codeforces 632D Longest Subsequence 2016-09-28 21:29 37人阅读 评论(0) 收藏

    D. Longest Subsequence time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. Java 容器 LinkedHashMap源码分析1

    同 HashMap 一样,LinkedHashMap 也是对 Map 接口的一种基于链表和哈希表的实现.实际上, LinkedHashMap 是 HashMap 的子类,其扩展了 HashMap 增加 ...

  6. nodejs async

    官网:https://github.com/caolan/async 流程控制:简化十种常见流程的处理集合处理:如何使用异步操作处理集合中的数据工具类:几个常用的工具类 流程控制 详细说明:http: ...

  7. java web渲染器

    渲染就是server端将夹杂有脚本语言变量对象的模版文件解释为纯html页面的过程!

  8. Eclipse的bug,SunTlsRsaPremasterSecret KeyGenerator not available

    这个bug出现在安装完java后,不设置环境变量,直接打开eclipse 以后只要用到SSL相关(即RSA密钥加密相关)的代码,都会报这个错误,该方法在lib\ext的sunjce_provider. ...

  9. Android-系统解析AndroidManifest

    在上一篇博客,Android-XML格式描述,介绍来XML在Android中的格式: Android-系统解析AndroidManifest,是分析Android系统是如何去解析AndroidMani ...

  10. JPA注解指南

    PA注解持久化类很方便,需要jar包:ejb3-persistence.jar.我用以下三个类来说明用法. @SuppressWarnings("serial") @Entity ...