index condition pushdown(icp)---mysql5.6新功能

如何理解 index condition pushdown ?

  index condition pushdown 是mysql使用索引在表里取得数据的一种优化。如果不使用icp,引擎层会遍历索引在基表中寻找数据行,然后返回给mysql server层,最后再为这些数据行进行where后的条件过滤。使用icp,如果部分where条件能使用索引中的字段,mysql server会把这部分下推到引擎层。存储引擎通过使用索引条目,然后推索引条件,然后用索引条件进行评估,使用这个索引把满足的行从表中读取出来。icp能减少引擎层访问基表的次数和mysql server访问访问引擎的次数。icp在存储引擎层能够过滤掉大量的数据,减少了对base table和mysql server的访问次数。


icp优化用于range,ref,eq_ref 和ref_or_null 访问方法,当这些需要访问全表的行。这个策略可以用用于innodb和myisam表。(需要注意的是,对于分区表还不支持icp,这种情况在5.7版本中会解决)。对innodb表来说,icp仅仅用于二级索引。icp的目的是减少全纪录读的数量,然后顺便降低io操作。对于innodb cluster index,完整的记录被读取到innodb buffer中,使用icp不能降低io

通过以下两种情况不使用icp和使用icp情况,来查看icp优化是如何工作

不使用icp:

1 、获得下一行数据,首先读取索引元组,然后用索引元组去查找和读取全表的整行数据

2、使用where条件部分监测应用于基表,接受或反对基表作为监测结果

使用icp:

1、获得下一行的索引元组(不是全表数据行)

2、监测where条件应用于基表,并检查where部分是否用于索引字段。如果条件不满足,继续下一行索引元组

3、如果条件满足,使用索引元组去查找并读取全行数据

4、继续监测剩余部分应用于表,接受或反对基表作为监测结果


当icp被使用后,explain的extra列显示using index condition。如下type range 。


参考:

http://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html

http://www.ruzuojun.com/topic/860.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值