ICP
Index Condition Pushdown(ICP)是Mysq使用索引从表中检索行数据的一种优化方式。
传统查询流程
- 存储引擎遍历索引定位行,返回给Server层
- Server层对这些数据进行
WHERE
过滤处理,返回给Client层
ICP优化查询流程
- 存储引擎在遍历索引定位行
- 存储引擎对这些索引进行
WHERE
过滤,返回Server层 - Server层将数据返回给Client层
查看ICP是否开启
SHOW variable like '%optimizer_switch%';
开启,关闭ICP
SET global optimizer_switch="index_condition_pushdown=on"; -- 开启全局参数
SET session optimizer_switch="index_condition_pushdown=on"; -- 开启会话参数
SET global optimizer_switch="index_condition_pushdown=off"; -- 关闭全局参数
SET session optimizer_switch="index_condition_pushdown=off"; -- 关闭全局参数
ICP的优点
- ICP将
WHERE
过滤条件放到了存储引擎层面去执行,带来了以下优点- 减少了存储引擎层访问基表的次数
- 减少了Server层访问存储引擎的次数。
MRR
Multi-Range Read Optimization(MRR)通过两个参数控制,一个是
mrr
, 另一个是mrr_cost_based
。两个参数是默认开启的(mrr=on
和mrr_cost_based=on
)。
mrr_cost_based
表示是否基于成本的算法来确定采用MRR
优化
-- 开启mrr_cost_based后会根据成本算法自行判断是否采用MRR优化
SET global optimizer_switch="mrr_cost_based=on";
-- 强制采用MRR优化
SET global optimizer_switch="mrr_cost_based=off";
mrr
表示是否开启MRR
优化
- 当mrr_cost_based=on mrr=on 时根据成本算法采用
MRR
优化- 当mrr_cost_based=off mrr=on 时永远采用
MRR
优化- 当mrr=off 时永远不采用
MRR
优化
MRR原理
- MySQL通过普通索引获取数据的方式
- 先通过索引页的叶子结点找到对应的主键
- 通过主键找到行数据记录
- 但是如果普通索引的字段有一些重复的值,那么根据这个字段去做
WHERE
过渡的时候,每次取到的主键顺序可能不是按照顺序的,因此随机I/O的现象应会发生。
- MRR的原理流程
- 先通过索引页的叶子结点找到对应的主键
- 把主键值都放入到
read_rnd_buffer
中然后在read_rnd_buffer
中进行排序- 通过排序好的主键值取得行数据记录