select * from tuser where name like ‘张%’ and age=10;
上面SQL
没有用索引下推
就是查到张开头的所有名字,拿到主键,去聚簇索引拿到完整记录,然后回到server服务器再对age=10筛选
使用索引下推后
先筛选张开头的所有,然后下推索引到age,就是顺便用age再做一次筛选,然后就不用去聚簇索引那完整记录到server,直接就筛选到了
没有使用ICP
在MySQL 5.6之前,存储引擎根据通过联合索引找到name likelike ‘张%’ 的主键id(1、4),逐一进行回表扫描,去聚簇索引找到完整的行记录,server层再对数据根据age=10进行筛选。
我们看一下示意图:
使用ICP
而MySQL 5.6 以后, 存储引擎根据(name,age)联合索引,找到,由于联合索引中包含列,所以存储引擎直接再联合索引里按照age=10过滤。按照过滤后的数据再一一进行回表扫描。