MRR
Multi-Range Read,多范围读,5.6以上版本开始支持
工作原理&优化效果:
将查询到的辅助索引结果放在一个缓冲(read_rnd_buffer_size = 4M)中
将buffer中的辅助索引根据主键(ROWID)进行排序
再根据上述排序后的主键(ROWID)顺序(回表)读取数据
减少磁盘随机访问,将随机访问转变成顺序访问,提高I/O读性能
减少buffer pool中的页面被替换次数
可批量处理对索引的查询操作
优化器开关optimizer_switch控制是否启用MRR:
默认未启用MRR
mrr = on & mrr_cost_based = on
mrr_cost_based设置为off时表示强制开启MRR
mrr_cost_based设置为on,表示优化器会通过基于成本的算法来确定是否 需要开启MRR(也就是,不强制启用MRR)
执行计划中现实 Using MRR
5.6.35中有bug
BKA
Batched Key Access,批量索引访问,MySQL5.6开始支持
同时用于表连接以及join buffer时的索引访问
支持inner join、outer join、semi-join,以及nested-outer join
JOIN表扫描时效率更高,提高JOIN效率
默认未启用,需要手动开启:
optimizer_switch = "batched_key_access_on"
前置条件:mrr=on,mrr_cost_based=off
执行计划显示 Using join buffer (Batched Key Access)
ICP
index condition pushdown,MySQL5.6以上支持
主要优化效果:
在以前,是把index key过滤后的全部记录(数据集较大)丢给server层,再进行index filter、table filter过滤
有了ICP,就可以把index filter下推(pushdown)到引擎层进行过滤
好处很明显,减少server层数据集,减少数据传输,提高处理效率
支持range、ref、eq_ref、eq_or_null类型查询
执行计划显示 Using index condition 意向
具体的执行计划看optimize_trace