mysql mrr_cost_based_mysql mrr介绍
转载于: https://blog.51cto.com/lee90/2058185
什么是MRR?
MRR:multi range read。
本质: MRR 在本质上是一种用空间换时间的算法
不好解释,先来看个例子:
select * from tb where key_column = x
在没有MRR的情况下,它是这样得到结果的:
1. select key_column, pk_column from tb where key_column=x order by key_column ---> 假设这个结果集是t
2. for each row in t ; select non_key_column from tb where pk_column = pk_column_value。(在Oracle里第2步叫回表?)
在有MRR的情况下,它是这样执行的:
1. select key_column, pk_column from tb where key_column = x order by key_column ---> 假设这个结果集是t
2. 将结果集t放在buffer里面(直到buffer满了),然后对结果集t按照pk_column排序 ---> 假设排序好的结果集是t_sort
3. select non_key_column fromtb where pk_column in (select pk_column from t_sort)
两者的区别主要是两点:
1. 没有MRR的情况下,随机IO增加,因为从二级索引里面得到的索引元组是有序,但是他们在主键索引里面却是无序的,所以每次去主键索引里面得到non_key_column的时候都是随机IO。(如果索引覆盖,那也就没必要利用MRR的特性了,直接从索引里面得到所有数据)
2. 没有MRR的情况下,访问主键索引的次数也会增加。没有MRR的情况下,二级索引里面得到多少行,那么就要去访问多少次主键索引(也不能完全这样说,因为MySQL实现了BNL),而有了MRR的时候,次数就大约减少为之前次数t/buffer_size。
所以说MRR主要解决的就是这两个问题。
此外,MRR还可以将某些范围查询,拆分为键值对,以此来进行批量的数据查询。这样做的好处是可以在拆分过程中,直接过滤一些不符合查询条件的数据。
如:
官方文档:https://dev.mysql.com/doc/refman/5.7/en/mrr-optimization.html
> SELECT * FROM t WHERE key_part1 >=1000 AND key_part1 < 2000 AND key_part2 = 1000;
表t有(key_part1,key_part2)的联合索引,因此索引根据key_part1,key_part2的位置关系进行排序。若没有MRR,此时查询类型为Range,SQL优化器会先将key_part1大于1000且小于2000的数据都取出来,即便key_part2不等于1000。取出后再根据key_part2的条件进行过滤。这会导致无用的数据被取出。
如果启用MRR优化器会使性能有巨大的提升,优化器会先将查询条件拆分为(1000,1000),(1001,1000),(1002,1000)....(1999,1000) 最后再根据这些拆分出的条件进行数据的查询。
是否启用MRR优化,可以通过参数optimizer_switch中的flag来控制。当MRR为on时,表示启用MRR优化。mrr_cost_based表示是否通过costbased的方式来选择是否启用mrr。若设置mrr=on,mrr_cost_based=off,则总是启用MRR优化。如下:
> SET GLOBAL optimizer_switch='mrr=on,mrr_cost_based=off';
参数read_rnd_buffer_size用来控制键值的缓冲区大小。当大于该值时,则执行器对已经缓存的数据根据RowID进行排序,并通过RowID来取得行数据,该值默认是256KB
>show VARIABLES like 'read_rnd_buffer_size';
+----------------------+---------+
| Variable_name | Value |
|----------------------+---------|
| read_rnd_buffer_size | 262144 |
+----------------------+---------+
mysql mrr_cost_based_mysql mrr介绍相关推荐
- mysql数据库引擎介绍
mysql数据库引擎介绍 你能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HE ...
- LAMP架构介绍、MySQL和MariaDB介绍、MySQL安装
2019独角兽企业重金招聘Python工程师标准>>> LAMP架构介绍 Linux+Apache+MySQL+PHP 就是在linux系统上安装httpd. mysql .PHP, ...
- mysql 查询日志介绍
MySQL查询日志介绍 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生产环境 ...
- MySQL复制类型介绍
MySQL复制类型介绍: (1)同步复制:MASTER提交事务,直到事务在所有的Slave都已提交,此时,才会返回给客户端,事务执行完毕. 缺点:完成一个事务可能会有很大的延迟. slave1 MAs ...
- MySQL查询日志介绍
MySQL查询日志介绍 MySQL的查询日志记录了所有MySQL数据库请求的信息.无论这些请求是否得到了正确的执行.默认文件名为hostname.log.默认情况下MySQL查询日志是关闭的.生产环境 ...
- MySQL第7天:MySQL的架构介绍之存储引擎
MySQL的架构介绍之存储引擎 #编写时间:2017.3.9 #编写地点:广州 1.存储引擎相关的命令 //查看已安装的mysql已提供的存储引擎 mysql>show engines;//查看 ...
- MySQL第6天:MySQL的架构介绍之逻辑架构
MySQL的架构介绍之逻辑架构 #编写时间:2017.3.7 #编写地点:广州 MySQL的优势主要体现在存储引擎的架构上,它是插件式的存储引擎架构,将查询处理和其它的系统任务以及数据的存储提取分离, ...
- MySQL第4天:MySQL的架构介绍之修改数据库编码格式
MySQL的架构介绍之修改数据库编码格式 1.配置文件介绍 #编写时间:2017.3.6 #编写地点:广州 上一篇文章可知mysql的配置文件在:/usr/share/mysql,其中/usr/sha ...
- MySQL第3天:MySQL的架构介绍之linux版安装
MySQL的架构介绍之linux版安装 #编写时间:2017.3.5 #编写地点:广州 mysql linux版安装 1.源码安装(本节不提) 2.rpm安装 (1)下载地址:https://dev. ...
最新文章
- virt-manager 的桥接网络配置问题
- Saying Good-bye to Cambridge Again --by Xu Zhimo
- php.ini 302,302使用nginx和WordPress重定向循环
- 从零开始搭二维激光SLAM --- 总结
- VRay高级材质素材分享,精选,热门
- JsonView 使用方法
- BMFont制作字体图集
- 中文免费电子书网站合集收藏
- 如何理解范德波尔方程
- FileZilla的下载与安装
- 神州优车黄强元:上云之路“一波三折”,为何最终选择阿里云?
- 和孩子读书学习的一点心得
- 高通挥刀 | 一点财经
- 一、ArcGIS Server篇:利用ArcGIS Server发布动态地图服务
- 微信小程序 之 mpvue
- JavaScript知识点 总结二:
- SAP ABAP 根据采购订单(PO)创建交货单(DN) BAPI_DELIVERYPROCESSING_EXEC - 创建内向交货单
- 安卓开发——微信UI界面
- Echarts 3D立体柱状图(源码+例图)
- 获取IE和Gecko内核的浏览器的网页内容的demo