索引下推

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

目录