索引下推ICP详解

using index condition

  • ICP只能针对二级索引进行使用。不需要针对主键索引
  • MySQL5.6之前,查询的时候,只会根据Index Key去存储引擎层,确定索引的范围,然后将该范围内的 记录取出来,返回到Sql Server层,SqlServer层,再根据where中其他的过滤条件进行过滤。有也 就是说IndexFilter和TableFilter都是在SqlServer层进行过滤的。
  • Using index condition 会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用WHERE 子句中的其他条件去过滤这些数据行;
  • 因为MySQL的架构原因,分成了server层和引擎层,才有所谓的“下推”的说法。所以ICP(Index Condition Pushdown,索引下推)其实就是实现了index filter技术,将原来的在server层进行的 table filter中可以进行index filter的部分,在引擎层面使用index filter进行处理,不再需要回表进行table filter。
  • Index Condition Pushdown(ICP)是MySQL 5.6中新特性,是一种在存储引擎层使用索引过滤数据的一种 优化方式。ICP可以减少存储引擎访问基表的次数以及MySQL服务器访问存储引擎的次数。

where条件分类

要想深入理解 ICP 技术,必须先理解数据库是如何处理 where 中的条件的。 
对 where 中过滤条件的处理,
根据索引使用情况分成了三种:index key, index filter, table filter

1. index key

  • 用于确定SQL查询在索引中的连续范围(起始范围+结束范围)的查询条件,被称之为Index Key。由于一个范围,至少包含一个起始与一个终止,因此Index Key也被拆分为Index First Key和Index LastKey,分别用于定位索引查找的起始,以及索引查询的终止条件。也就是说根据索引来确定扫描的范围。

2. index filter

  • 在使用 index key 确定了起始范围和结束范围之后,在此范围之内,还有一些记录不符合where 条件,如果这些条件可以使用索引进行过滤,那么就是 index filter。也就是说用索引来进行where条件过滤。

3. table filter

  • where 中的条件不能使用索引进行处理的,只能访问table,进行条件过滤了。

    也就是说各种各样的 where 条件,在进行处理时,分成了上面三种情况,一种条件会使用索引确定扫描的范围;一种条件可以在索引中进行过滤;一种必须回表进行过滤;
    如何确定哪些where条件分别是 index key, index filter, table filter?

  • 在 MySQL5.6 之前,并不区分Index Filter与Table Filter,统统将Index First Key与Index
    Last Key范围内的索引记录,回表读取完整记录,然后返回给MySQL Server层进行过滤。

  • 而在MySQL 5.6(包含)之后,Index Filter与Table Filter分离,Index Filter下降到InnoDB的
    索引层面进行过滤,减少了回表与返回MySQL Server层的记录交互开销,提高了SQL的执行效
    率。

  • 所以所谓的 ICP 技术,其实就是 index filter 技术而已。只不过因为MySQL的架构原因,分成了server层和引擎层,才有所谓的“下推”的说法。所以ICP其实就是实现了index filter技术,将原来的在server层进行的table filter中可以进行index filter的部分,在引擎层面使用index filter进行处理,不再需要回表进行table filter。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值