索引下推的基本原理

本文介绍了MySQL5.6引入的索引下推(ICP)特性,旨在减少回表查询次数,提高查询效率。通过示例展示了ICP如何工作,并探讨了其在实际查询中的应用和限制条件,以及如何通过optimizer_switch参数控制ICP的启用。
摘要由CSDN通过智能技术生成

什么是索引下推

索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。

索引下推优化的原理

我们先简单了解一下MySQL大概的架构:

在这里插入图片描述

MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。

索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。

我们来具体看一下,在没有使用ICP的情况下,MySQL的查询:

  • 存储引擎读取索引记录;
    根据索引中的主键值,定位并读取完整的行记录;
    存储引擎把记录交给Server层去检测该记录是否满足WHERE条件。

使用ICP的情况下,查询过程:

  • 存储引擎读取索引记录(不是完整的行记录);
    判断条件部分能否用索引中的列来做检查,条件不满足,则处理下一行索引记录;
    条件满足,使用索引中的主键去定位并读取完整的行记录(就是所谓的回表);
    存储引擎把记录交给层,层检测该记录是否满足条件的其余部分。

索引下推的具体实践
理论比较抽象,我们来上一个实践。

使用一张用户表tuser,表里创建联合索引(name, age)。
在这里插入图片描述

如果现在有一个需求:检索出表中名字第一个字是张,而且年龄是10岁的所有用户。那么,SQL语句是这么写的:

select * from tuser where name like '张%' and age=10;

假如你了解索引最左匹配原则,那么就知道这个语句在搜索索引树的时候,只能用 张,找到的第一个满足条件的记录id为1。
在这里插入图片描述

那接下来的步骤是什么呢?

没有使用ICP
在MySQL 5.6之前,存储引擎根据通过联合索引找到name likelike ‘张%’ 的主键id(1、4),逐一进行回表扫描,去聚簇索引找到完整的行记录,server层再对数据根据age=10进行筛选。

我们看一下示意图:
在这里插入图片描述

可以看到需要回表两次,把我们联合索引的另一个字段age浪费了。

使

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值