mysql中index和range区别_浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化...

本文详细解析了MySQL中的Index Condition Pushdown (ICP)和Multi-Range Read (MRR)两种查询优化技术。ICP允许在索引查找过程中同时应用无法直接使用索引的条件,减少了数据筛选步骤。MRR则通过排序二级索引范围查找的数据,以顺序IO方式读取,降低随机IO带来的性能影响。这两种优化策略提高了查询效率,但也需要根据具体场景权衡使用。
摘要由CSDN通过智能技术生成

本文出处:http://www.cnblogs.com/wy123/p/7374078.html

(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他)

ICP优化原理

Index Condition Pushdown (ICP),也称为索引条件下推,体现在执行计划的上是会出现Using index condition(Extra列,当然Extra列的信息太多了,只能做简单分析)

ICP原理通俗讲就是,查询过程中,直接在查询引擎层的API获取数据的时候实现"非直接索引"过滤条件的筛选,而不是查询引擎层查询出来之后在Server层筛选。

换句话说就是ICP在获取数据的同时实现了where的次选条件中无法直接使用索引的情况下的筛选,避免了没有ICP优化的时候分两个步骤的实现(获取数据的过程没有做次选条件的过滤)

如果是非ICP优化查询的话,是两步,第一步是获取数据,第二步是获取的数据进行条件筛选。

显然,相比后者,前者可以一步实现索引的查找Seek+filter,效率上更高。

适应的场景:

ICP的优化策略可用于range、ref、eq_ref、ref_or_null 类型的访问数据方法

其实没有实例不太好理解这种优化策略,还是举两个实际列子吧。

ICP优化实例

下面用到的test_orderdetail表的索引为:create index idx_orderid_productname on test_orderdetail(order_id,product_name);

查询语句为:select * from test_orderdetail where order_id = 10900 and product_name like '%00163e0496af%';

显然,order_id = 10900是可以直接进行索引查找的,虽然product_name也包含在复合索引中,但是product_name like '%00163e0496af%'是无法使用索引的

观察其执行计划,发现Extra中是Using index condition。

ICP在这里的优化原理就是,

在利用第一个条件 order_id = 10900 进行索引查找的过程中,同时使用product_name like '%00163e0496af%'这个无法直接使用索引查找的条件进行过滤。

最终一步就可以筛选出来结果。

set optimizer_switch='index_condition_pushdown=off或者on'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值