MySQL学习----ICP(索引下推)
官网原地址:
https://dev.mysql.com/doc/refman/8.0/en/index-condition-pushdown-optimization.html
前提工作:
创建一个学生成绩表,
建立索引
create index id_name on student(name);
explain
SELECT *
FROM school.student
where name>'z' and name like '%a';
一.什么是ICP
ICP索引下推功能是mysql5.6推出的查询优化策略,把原本是server层做的索引条件判断,下推给存储引擎层做,可以减少存储引擎必须访问基表的次数和MySQL服务器必须访问存储引擎的次数。,提高查询效率
为什么需要索引下推
没有索引下推的步骤
- server 层首先调用存储引擎的接口定位到满足形成扫描区间的区间的第一条二级记录 (这个sql下就是name>‘z’)
- 存储引擎根据B+树索引快速定位到这条二级索引记录后,根据该二级索引记录的主键值回表,将完整的记录返回给server层
- server层再判断其他的搜索条件是否成立,如果成立发送给客户端,否则跳过该条记录,然后向存储引擎要下一条记录
- 直至将扫描区间的所有记录都扫描为止
有了索引下推之后的步骤 - server 层首先调用存储引擎的接口定位到满足形成扫描区间的区间的第一条二级记录。
- 存储引擎根据B+树索引快速定位到这条二级记录后,不是急于回表操作,而是先判断一下所有关于name 索引中包含的列是否成立,也就是name>‘z’ and name like ‘%a’
是否成立,如果不成立则跳过该记录,去下一条索引记录,成立则回表。 - setver再判断其他的搜索条件是否成立,成立就返回客户端,不成立就跳过,然后去判断下一条存储引擎回表的记录。
- 直至将扫描区间的所有记录都扫描为止
节省I/0的地方
因为每次执行回表操作,需要将一个聚簇索引页面加载到内存中,这样省去了多次回表操作,节省了I/O。
如何知道有没有进行索引下推:
查看执行计划的Extra:Using index condition
存储引擎存判断的条件
所有与该索引有关的判断条件