mysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown

mysql 可分为两层server层和存储引擎层,server层又包括:连接器,解析器,优化器,执行器四个重要的层次。。
回表是从server层再次访问存储引擎的过程。使用索引在查询的时候存储引擎返回到server层的数据是整个索引的关键字,如果用户要的数据字段就是索引的字段,即覆盖了,Extra的字段就会有Using Index,表示不需要回表了。但是即使存储引擎返回的数据在server层也会有可能被再次被server层过滤再返回给用户,根据是否server层进行过滤Extra会有无Using where,如果覆盖了并且server 还过滤了,就会有Using Index Using where;
看下图:
score表已有索引(s_id, c_idmysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown
返回Using Index,server层没有过滤mysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown
返回Using index; Using where(注意:like语句不会启动索引的,普通索引不会用于模糊查询)
mysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown
返回Using where 说明用户要的字段不完全覆盖,server层要进行过滤,
mysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown
注意:没有索引的动用都是using where
mysql的Extra的4个属性Using index UsingWhere 和Index Condition Pushdown

最难的索引下推(index Condition pushdown)简称ICP(不懂,后补,网上说的也是瞎吹,根本就不会显示Using index Condition)

首先他是一个执行引擎的概念,不是server层,是一个优化的手段。

mysql5.6+以后默认是启动整个优化手段的,他在以下的条件成立时会自动启动:
1.只能用于二级索引(secondary index)

explain显示的执行计划中type值

(join 类型)为range、 ref、 eq_ref或者ref_or_null。

2.**且查询需要访问表的整行数据,**即不能直接通过二级索引的元组数据获得查询结果(索引覆盖)。

对于InnnoDB表,ICP仅用于二级索引。(ICP的目的是减少全行读取的次数,从而减少IO操作),对于innodb聚集索引,完整的记录已被读入到innodb缓冲区,在这种情况下,ICP不会减少io。
下图什么也没显示,不知为什么,可能就是Using index Condition
ICP可以减少存储引擎层返回需要被index filter过滤掉的行记录,省去了存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。

使用ICP前后存储引擎工作的区别参考