MySQL InnoDB MRR优化指南

yizhihongxing

MySQL InnoDB MRR优化指南

什么是MRR

MRR(Multi-Range Read)是MySQL InnoDB存储引擎在执行查询时的一种优化方式。它的优化思路是将多个范围读请求合并成一个请求,从而减少磁盘I/O,提高查询效率。

MRR优化条件

MRR优化并不是所有查询都可以享受的,它有如下一些优化条件:

  1. 查询是基于索引的范围查询。
  2. 索引是联合索引。
  3. 查询涉及的列全部来自于索引。
  4. 查询涉及的所有列的数据类型是相同的。

只有当这些条件都满足时,MRR才会生效。

MRR的开启

MRR的默认开启是关闭的,需要手动设置才能启用。MRR优化的开启方式如下:

SET @@optimizer_switch='mrr=on';

我们也可以通过以下方式检查MRR是否开启:

SHOW STATUS LIKE 'Innodb_have_mrr%';

如果结果是Yes,则MRR已经成功开启。

MRR的优化效果

MRR可以因合并磁盘I/O而减少单个查询的时间,从而提高查询效率。下面我们通过两个实际的例子来演示MRR的优化效果:

示例1

我们创建一个测试表用于测试MRR优化效果:

CREATE TABLE `test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `phone` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `name_phone_idx` (`name`,`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

往表中插入100w条记录:

insert into test(name, phone) select left(md5(rand()), 4), left(md5(rand()), 11) from t1,t1,t1,t1,t1,t1,t1,t1,t1,t1;

执行如下的查询语句,查询所有名字为"abcd"的记录:

SELECT * FROM test WHERE name="abcd";

开启MRR优化后,查询时间由10s左右减少到6s左右,效率提升了40%。

示例2

接下来,我们将对表中的两列进行查询,其中一列使用等值查询,另一列使用范围查询。具体语句如下:

SELECT * FROM test WHERE name="abcd" AND phone>"dQp5kn" AND phone<"fVtwOZ";

这个语句可以看作是同时使用了索引"name_phone_idx"中的name和phone两列。如果关闭MRR的优化,执行时间大概在16s左右。

开启MRR优化后,查询时间缩短为7s左右,效率提高了超过50%。

结论

通过以上的两个实例,我们可以看到,使用MRR优化可以让我们的查询语句在减少磁盘I/O的同时,提高查询效率。对于需要处理大量数据的查询任务,这种优化方式可以给查询性能带来可观的提升。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL InnoDB MRR优化指南 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MySQL插入emoji表情失败问题的解决方法

    当我们在使用MySQL数据库进行开发时,有时需要在数据库中存储包含表情符号(emoji)的数据,但是我们在插入数据时可能会遇到插入emoji表情失败的问题。下面是一条针对该问题的解决攻略。 问题分析 MySQL的默认编码为utf8,它只支持3个字节的UTF-8字符,而emoji表情在UTF-8编码中需要4个字节才能表示,因此在MySQL中插入包含emoji表…

    MySQL 2023年5月18日
    00
  • MySQL唯一约束(UNIQUE KEY)详解

    MySQL的唯一约束是一种用于确保表中某一列的每个值都是唯一的约束。它可以应用于单个列或多个列,以确保每个组合值都是唯一的。 在MySQL中,可以使用UNIQUE关键字定义唯一约束。以下是使用唯一约束的语法: CREATE TABLE table_name ( column1 datatype UNIQUE, column2 datatype, … );…

    MySQL 2023年3月9日
    00
  • MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎详解

    MySQL高级学习笔记(三)包含了Mysql逻辑架构介绍和MySQL存储引擎详解两个部分,其中分别讲解了MySQL的重要特性和基础知识以及如何进行存储引擎的选择和操作。 Mysql逻辑架构介绍 MySQL的逻辑架构分为三层:连接层、服务层和存储引擎层。其中连接层负责处理客户端与服务器之间的连接和通信,服务层负责解析和执行SQL语句,存储引擎层负责数据存储和管…

    MySQL 2023年5月19日
    00
  • centos7 安装mysql5.7(源码安装)

    Centos7将默认数据库mysql替换成了Mariadb 在接下来的mysql安装过程中,请一定保证自己当前所在目录是正确的!  e g: [root@localhost ~]# 表示当前目录为~ [root@localhost mysql]# 表示当前目录为mysql 一、安装MySQL 1、下载安装包mysql-5.7.17-linux-glibc2.…

    MySQL 2023年4月13日
    00
  • html css javascript mysql php一些简单随笔

    1.格式 <!doctype html> 声明文档类型,说明html版本号 <html> 说明代码格式 <head>  网页的头部 <meta charset=”utf-8″> 定义网页字符集,关键词等内容:例如:<meta name=”keywords” content=”html”> <t…

    MySQL 2023年4月12日
    00
  • MySQL在grant时报错ERROR 1064 (42000)的原因及解决方法

    当我们在使用MySQL的时候,有可能会在授权(grant)的时候遇到“ERROR 1064 (42000)”的报错信息。下面是该错误的原因及解决方法。 错误原因 “ERROR 1064 (42000)”错误通常是由于以下原因导致的: SQL语句的语法有误 某些保留关键词被错误使用 数据表名、列名、用户名或密码使用了非法字符 等等 在授权(grant)时,我们…

    MySQL 2023年5月18日
    00
  • SQL的10种基本书写规则

    SQL(Structured Query Language,结构化查询语言)是一种用于数据库管理系统的计算机语言,它用于从数据库中检索和管理数据。 对于 SQL 初学者,在写 SQL 语句时,只要遵守下面几个书写规则,就可以避免很多错误。 以下是SQL的基本书写规则: SQL语句必须以关键字开始,并以分号(;)结束。例如: SELECT * FROM cus…

    MySQL 2023年3月9日
    00
  • MySQL count(*)统计总数问题汇总

    MySQL count(*)统计总数问题汇总 在MySQL中,我们经常需要对表中的数据进行统计,例如统计总数。常用的统计函数之一就是count(),该函数用于统计表中的记录数量。但是在使用count()时,也会遇到一些问题。 本文将总结一些常见的MySQL count(*)统计总数问题,并提供完整的解决方案和示例说明。 问题1:count(*)返回的总数太大…

    MySQL 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部