第6章-ICP,MRR,BKA

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=onmrr_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通过普通索引获取数据的方式
    1. 先通过索引页的叶子结点找到对应的主键
    2. 通过主键找到行数据记录

  • 但是如果普通索引的字段有一些重复的值,那么根据这个字段去做WHERE过渡的时候,每次取到的主键顺序可能不是按照顺序的,因此随机I/O的现象应会发生。

  • MRR的原理流程
    1. 先通过索引页的叶子结点找到对应的主键
    2. 把主键值都放入到read_rnd_buffer中然后在read_rnd_buffer中进行排序
    3. 通过排序好的主键值取得行数据记录

猜你喜欢

转载自blog.csdn.net/Pig_Pig_Bang/article/details/80625756