索引下推介绍:

索引下推是数据库检索数据过程中为减少回表次数而做的优化
索引条件下推(Index Condition Pushdown),简称 ICP 。MySQL 5.6 新添加,用于优化数据的查询。
当不使用ICP,通过使用非主键索引(普通索引或二级索引)进行查询,存储引擎通过索引检索数据,然后返回给MySQL服务器,服务器再判断是否符合条件。
当使用ICP,当存在索引的列作为判断条件时,MySQL 服务器将这一部分判断条件传递给存储引擎,然后存储引擎通过判断索引是否符合 MySQL 服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给 MySQL服务器。

使用场景

1.当需要整表扫描
2.适用 Innodb引擎和 MyISAM 引擎(5.6 版本不适用分区查询,5.7版本适用分区表查询)
3.InnoDB 引擎适用于二级索引。
4.子查询条件不能下推。触发条件不能下推。调用存储条件过程不能下推。

示例

  1. select * from user where name like "z%" and age=20;

1.对于MySQL 5.6 之前:我们在索引内部首先通过name进行查找,在联合索引 name,age树形查询结果可能存在多个,然后在拿着 id 值去回表查询,整个过程需要回表多次。
image.png
2.对于MySQL 5.6 之后,我们在索引内部就判断 age 是否等于 20,对于不等于 20 的跳过。因此在联合索引 name,age 索引树按照条件配置记录,然后拿着 id 去主键索引树中回表进行查询全部数据。
image.png
image.png
当Extra值为:Using index condition.表示使用索引下推。

  • 通过索引下推对于非主键索引进行优化,可有效减少回表次数,从而提高效率。

关闭索引下推:

  1. SET optimizer_switch = 'index_condition_pushdown=off';

image.png
Extra:Using where