MySQL InnoDB MRR优化指南

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联合索引最左匹配原则

    MySQL联合索引是一种通过组合多个列来优化查询性能的索引类型。其中,联合索引的最左匹配原则是指,索引能够被优化使用的部分内容必须是联合索引从左到右的前缀。在本文中,我们将深入浅析Mysql联合索引的最左匹配原则,以及如何优化查询性能。 什么是联合索引最左匹配原则? 联合索引最左匹配原则是指,在使用联合索引进行查询时,只有从左到右的连续列可以被索引使用。换言…

    MySQL 2023年5月19日
    00
  • MySQL中的异常处理

      与java中的异常一样,都是用来定义在处理过程中遇到的问题以及相应的处理方式。 2,自定义异常及处理方式   1,自定义异常语句     DECLARE condition_name CONDITION FOR condition_value;     condition_name:是自己起的名字,最好见名知意。     condition_value:…

    MySQL 2023年4月13日
    00
  • 解决MySQL数据库意外崩溃导致表数据文件损坏无法启动的问题

    MySQL 数据库因为各种原因可能会意外崩溃,这会导致表数据文件损坏,从而导致 MySQL 无法启动。下面是解决这个问题的一些攻略: 方法一:使用 MySQL 的恢复工具 MySQL 自带了一些恢复工具,可以通过下面的步骤来使用: 停止 MySQL 服务。 打开命令行窗口,进入 MySQL 安装目录的 bin 子目录中。 运行以下命令启动 MySQL 数据库…

    MySQL 2023年5月18日
    00
  • MySQL导入导出.sql文件及常用命令小结

    下面就为您详细讲解MySQL导入导出.sql文件及常用命令小结的完整攻略。 1. 导出.sql文件 命令行导出 使用命令行导出SQL文件,可以直接使用MySQL 命令提示符(MySQL command prompt)或操作系统命令行(如Windows的CMD界面)。 在 MySQL 命令提示符中使用mysqldump命令 mysqldump -u [用户名]…

    MySQL 2023年5月18日
    00
  • MySQL 多列索引优化小记

    MySQL 5.6.30 由于爬虫抓取的数据不断增多,这两天在不断对数据库以及查询语句进行优化,其中一个表结构如下: CREATE TABLE `newspaper_article` ( `id` varchar(50) NOT NULL COMMENT ‘编号’, `title` varchar(190) NOT NULL COMMENT ‘标题’, `a…

    MySQL 2023年4月13日
    00
  • 快速解决mysql深分页问题

    下面是“快速解决mysql深分页问题”的完整攻略。 1. 什么是深分页问题 深分页问题是指在查询mysql数据时,需要跨越非常大的范围进行分页查询,导致查询时间过长或者系统崩溃的情况。比如一个很大的数据表有1000000条记录,每页显示10条记录,当我们需要查询第900000到第900010条记录时,就需要检索整张表中的数据,如果数据量很大,就会导致查询速度…

    MySQL 2023年5月19日
    00
  • mysql利用覆盖索引避免回表优化查询

    MySQL中的覆盖索引是指当我们查询的结果可以直接从索引中获取,而不需要再去查询数据表中其他的列时,就可以利用覆盖索引来避免回表操作,从而优化查询操作的效率,提升整个系统的性能。 以下是基本的步骤: 创建合适的索引:通过EXPLAIN命令分析查询语句,检查是否使用了索引,如果没有,则需要创建合适的索引。 包含所有必需列的索引:确保创建的索引包含所有SELEC…

    MySQL 2023年5月19日
    00
  • 设置MySQL中的数据类型来优化运行速度的实例

    为了优化MySQL的运行速度,常用的方法之一就是设置合适的数据类型。下面是设置MySQL中数据类型来优化运行速度的实例攻略。 步骤一:了解数据类型 在设置数据类型前,我们需要先了解MySQL支持的各种数据类型,并且清楚它们的区别及用途。 MySQL支持的常见数据类型包括: 数值型:INT、FLOAT、DOUBLE等。 字符型:VARCHAR、CHAR、TEX…

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