如何理解 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