说下索引条件下推(ICP)?

#365天学习打卡# 66

首先声明一点索引下推不是只存在关联索引中,普通索引也可以执行索引下推;一般提到索引下推条件反射的都会先想到关联索引查询;

Using index condition 可以理解为 ICP 的必要不充分条件;即执行计划Extra中出现Using index condition,但是SQL语句却不一定发生索引下推,using index condition 我理解的是“可以下推”,也就是说“在执行逻辑上可以下推,但不一定非要执行索引下推这个操作”;

表结构:person 表中有四个字段,id,name,age,gender,其中 id为主键,name,age 关联索引;

举个索引下推的简单例子:

存在两条记录 它们name都是 ab,age 值分别是 2,15;

select * from person where name ='ab' and age =2;

这条sql在回表时只查询一条数据,查找到所有name是 ab 的记录以后,又作了age=2的判断才进行回表查询; 5.6以前是查到所有name是 ab 的两条记录以后直接回表然后和age做对比;

小问题:这五条SQL中前三条都进行了索引下推查询,思考一下经常提到的 范围查询后面的查询条件不生效的试用场景;

select *  FROM person WHERE name = 'ab' and age = 15;
select *  FROM person WHERE name like 'a%' and age = 3;
select *  FROM person WHERE name > 'b' and name like '%b';
select *  FROM person WHERE name > 'a' and age = 3;
select *  FROM person WHERE name > 'b' and name < 'c' and age = 3;