说说mysql的MRR,ICP,BKA优化。

一)MRR优化
Multi-Range Read优化mysql5.6版本开始支持MRR优化,,目的是为了减少磁盘的随机访问,
并且将随机访问转化为较为顺序的顺序访问,适用于range,ref,eq_ref类型的查询。
MRR优化有以下几个好处:
1 MRR 使数据访问变得较为顺序 ,在查询辅助索引时,首先根据得到的查询结果,
按照主键进行排序,并按照主键排序的顺序进行书签查找。

2 减少缓冲池中页被替换的次数。

3 批量处理对键值的查询操作

innodb存储引擎的范围查询和JOIN查询操作,MRR的工作方式如下:

1 将查询得到的辅助索引键值存放于一个缓存中,这时缓存中的数据是根据辅助索引键值排序的。
2 将缓存中的键值根据RowID进行排序。
3 根据RowID的排序顺序来访问实际的数据文件。

MRR优化还可以将某些范围查询拆分为键值对,以此来进行批量的数据查询。
倘若启用了MRR优化,优化器会先将查询条件进行拆分,然后在进行数据查询,避免大量无用数据被取出。

是否启用MRR优化可以通过参数 optimizer_switch 中的标记来控制,
show global variables like ‘%optimizer_switch%’;
±-----------------±--------------------------------------------------------------------------------------------------------------------------
|Variable_name|Value|
±-----------------±--------------------------------------------------------------------------------------------------------------------------
| optimizer_switch | 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=off,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 |
±-----------------±--------------------------------------------------------------------------------------------------------------------------
1 row in set (0.00 sec)

当mrr为on时,表示启用MRR优化,
mrr_cost_based=on标记表示是否通过cost based的方式来选择是否启用mrr,
若mrr设为on,mrr_cost_based设为off,则总是启用MRR优化,
set @@optimizer_switch=‘mrr=on,mrr_cost_based=off(生产mrr_cost_based配置on,)’;
mrr_cost_based选项表示是否通过基于成本的算法来确定开启Mrr特性,;设置为on,表示自行判断,若为off表示强制开启mrr。

参数read_rnd_buffer_size用来控制键值的缓冲区大小,当大于该值时,则执行器对已经缓存的数据根据RowID进行排序,并通过RowID来取得行数据,生产该值为512K,

二)ICP优化
Index Condition Pushdown (ICP)优化
和MRR优化一样,ICP优化同样是mysql5.6开始支持的一种根据索引进行查询的优化方式,
即,在取出索引的同时,判断是否可进行where条件的过滤,也就是将where的部分过滤操作放在了存储引擎层,可以大大减少上层SQL对记录的索取,从而提高数据库的整体性能。

当优化器选择index condition pushdown优化时,可以在执行计划的列Extra看到 Using index condition.

ICP的开启也是通过optimizer_switch选项的index_condition_pushdown开启。


三)BKA优化

BKA(batched key access)提高表join性能的算法,作用就是在读取被join表的记录的时候使用顺序I/O。
BAK的原理:对于多表join语句,当mysql使用索引访问第二个join表时,使用一个join buffer来收集第一个操作对象生成的相关列值。BKA构建好key后,批量传给引擎层做索引查找。
key是通过MRR结构交给引擎的,这样一来MRR是的查询更加有效。
查看join_buffer_size大小。
mysql> show global variables like ‘join_buffer_size’;
±-----------------±-------+
| Variable_name | Value |
±-----------------±-------+
| join_buffer_size | 262144 |#生产2097152(2M)
±-----------------±-------+
1 row in set (0.00 sec)

mysql通过optimizer_switch参数中的batched_key_access选项,该选项默认是关闭的(生产关闭)。
想要开启该参数,必须先要保证是在强制使用MRR的基础上才可以。
set global optimizer_switch=‘mrr=on,mrr_cost_based=off’;
set global optimizer_switch=‘batched_key_access=on’;

当使用BKA时,执行计划的extra列会显示using join buffer(BAK)关键字。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值