类别 using index
含义 索引覆盖
效率 非常高
特点 通过二级索引实现索引覆盖(无需回表,可以直接在索引树的叶子节点上拿到数据)
类别 using where;using index
含义 索引覆盖
效率 非常高
特点 通过二级索引实现索引覆盖(无需回表,可以直接在索引树的叶子节点上拿到数据),索引条件中存在in、>、>=、<、<=等等,索引类型为range类型
类别 using index condition
含义 索引条件下推(index condition pushdown)
效率 较高
特点 MySQL在5.6版本引入了索引下推。根据左前缀原则,前部分索引匹配,where中有在索引列上的条件没有用到,会继续使用未使用索引列条件在当前的索引上继续推导计算。目的是为了过滤更多的行,以减少回表次数。

索引条件下推开关

show global variables like 'optimizer_switch';
#检查是否出现index_condition_pushdown=on

官方案例

#索引
INDEX (zipcode, lastname, firstname)

SELECT * FROM people
  WHERE zipcode='95054'
  AND lastname LIKE '%etrunia%'
  AND address LIKE '%Main Street%';

分析:联合索引当前只有zipcode生效,lastname与address使用了完全模糊查询所以失效。

在没有索引下推机制时,通过二级索引zipcode拿到主键后立即回表查询,并携带lastname与address两条件进行再次过滤。

在有索引下推机制后,首先通过zipcode确定二级索引索引,在当前的索引上通过lastname与address条件尽可能做出更多的过滤。缩小了获取主键的范围,意味着减少回表查询的次数开销。