索引下推介绍

索引下推

  • 介绍
  • 作用
  • MySQL5.6之前
  • MySQL5.6及以上版本
  • 举例说明
    • 该语句的具体执行
      • MySQL 5.6之前
      • MySQL 5.6之后
    • 判断方法
    • 总结

介绍

索引条件下推,也叫索引下推,英文全称‘Index Condition Pushdown’, 简称ICP。

作用

索引下推是MySQL5.6新添加的特性,用于优化数据的查询。

MySQL5.6之前

通过使用非主键索引进行查询的时候,存储引擎通过索引查询数据。

然后将结果返回给MySQL server层,在server层判断是否符合条件。

MySQL5.6及以上版本

可以使用索引下推的特性。

当存在索引的列作为判断条件时,MySQL server将这一部分判断条件传递给存储引擎。

然后存储引擎会筛选出符合MySQL server传递条件的索引项。

即在存储引擎层根据索引条件过滤掉不符合条件的索引项,然后回表查询得到结果,将结果返回给MySQL server。

有了索引下推的优化,在满足一定的条件下,存储引擎层会在回表查询之前对数据进行过滤,可以减少存储引擎回表查询的次数。

举例说明

假设有一张用户信息表user_info

表有三个字段name, level, weapon(装备),建立联合索引(name, level), 表初始数据如图:
索引下推介绍_第1张图片
假如需要匹配姓名第一个字为"大“,并且level为1的用户,SQL语句为:

SELECT * FROM user_info WHERE name LIKE "大%" AND level = 1;

该语句的具体执行

MySQL 5.6之前

没有索引下推,其执行过程如图:
索引下推介绍_第2张图片
查询条件name“大%”不是等值匹配。

根据最左匹配原则,在(name, level)索引树上只用到name去匹配,查找到两条记录(id为1和4)。

拿到这两条记录的id分别回表查询,然后将结果返回给MySQL server。

在MySQL server层进行level = 1字段的判断。

MySQL 5.6之后

MySQL5.6及以上版本的执行过程如下:
索引下推介绍_第3张图片
相比5.6以前的版本,多了索引下推的优化。

在索引遍历过程中,对索引中的字段先做判断,过滤掉不符合条件的索引项。

也就是判断level是否等于1,level不为1则直接跳过。

因此在(name,level)索引树只匹配一个记录,之后拿着此记录对应的id(id=1)回表查询全部数据。

整个过程回表1次。

判断方法

可以使用explain查看是否使用了索引下推。

当explain输出的Extra列的值为Using Index condition,则标识使用了索引下推。

总结

从上面的列子可以看出,使用索引下推在某些场景下可以有效减少回表次数,从而提高查询效率。

参考资料:什么是索引下推?


 

你可能感兴趣的:(sql,mysql)