索引下推
4 分钟阅读
•
593 字
+
451 词
索引下推 (lndex Condition pushdown,简称ICP)是MySQL 5.6 版本引入的-种索引优化技术,它可以在索引遍历过程中,==
某些列无法使用到联合索引
,但是它
包含在联合索引中
==,
就对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表
,可以
有效的减少回表次数
。
当你的查询语句的执行计划里,出现了
Extra 为 Using index condition
,那么说明使用了索引下推的优化。
对于联合索引(name,age,position),正常情况按照最左前缀原则,以上SQL语句只会走name字段索引。因为根据name字段过滤完,得到的索引行里的age和position是无序的,无法很好的利用索引。
索引下推
的
下推
其实就是指将==
部分上层(服务层)负责的事情,交给了下层(引擎层)去处理
==。
我们来具体看一下,在
没有使用ICP的情况下
,MySQL的查询:
- 存储引擎读取索引记录;
- 根据索引中的主键值,定位并读取完整的行记录;
- 存储引擎把记录 交给Server层去检测该记录是否满足WHERE条件 。
- 存储引擎 读取索引记录 (不是完整的行记录);
- 判断条件部分能否用 索引中的列来做检查,条件不满足,则处理下一行索引记录;
- 条件满足,使用 索引中的主键去定位并读取完整的行记录(就是所谓的回表) ;
- 存储引擎把记录交给服务层,服务层检测该记录是否满足条件的其余部分。
mysql
联合索引:【name + age + position】
SELECT
*
FROM
employees
WHERE
name like 'wei66%'
AND
age =22
AND
position ='manager
- 在MySQL5.6之前的版本,这个查询只能在联合索引里匹配到名字是wei66开头的索引,然后拿这些索引对应的主键逐个回 表,到主键索引上找出相应的记录,再比对age和position这两个字段的值是否符合。
- 但是在MySQL5.6及之后的版本使用了索引下推优化后,上面那个查询在联合索引里匹配到名字是wei66开头的索引之后, 同时还会在索引里过滤age和position这两个字段 ,如下图,明显是使用到了索引的这3个字段。最后拿着过滤完剩下的索引对应的主键id再回表查整行数据。