天天看点

Mysql知识延展(三)索引条件下推

索引条件下推(ICP)

ICP(

index condition pushdown

)是mysql利用

索引(二级索引)元组

筛选字段在索引中的where条件

从表中提取数据记录的一种

优化操作

ICP的思想是:存储引擎在访问索引的时候检查筛选字段在索引中的where条件(pushed index condition,推送的索引条件),如果索引元组中的数据不满足推送的索引条件,那么就过滤掉该条数据记录。ICP(优化器)

尽可能的把index condition的处理从server层下推到storage engine层

。storage engine使用索引过滤不相关的数据,仅

返回符合index condition条件的数据给server层

。也是说数据过滤尽可能在storage engine层进行,而不是返回所有数据给server层,然后后再根据where条件进行过滤。

使用ICP(

mysql 5.6

版本以前)和没有使用ICP的数据访问和提取过程如下:

优化器

没有使用ICP时

,数据访问和提取的过程如下:

  1. 当storage engine读取下一行时,首先读取索引元组(index tuple),然后使用索引元组在基表中(base table)定位和读取整行数据。
  2. server层评估where条件

    ,如果该行数据满足where条件则使用,否则丢弃。
  3. 循环执行1

    ,直到最后一行数据。
Mysql知识延展(三)索引条件下推

优化器

使用ICP时

,server层将会把

能够通过使用索引进行评估的where条件下推

storage engine

层。数据访问和提取过程如下:

  1. storage engine从索引中读取下一条索引元组。
  2. storage engine使用索引元组评估下推的索引条件。如果

    没有满足where条件

    ,storage engine将会

    处理下一条索引元组(回到上一步)

    。只有当索引元组

    满足下推的索引条件

    的时候,才会继续去

    基表中读取数据

  3. 如果

    满足下推的索引条件

    ,storage engine通过索引元组定位基表的行和

    读取整行数据并返回给server层

  4. server层评估没有被下推到storage engine层的where条件

    ,如果该行数据满足where条件则使用,否则丢弃。
    Mysql知识延展(三)索引条件下推

索引条件下推的意思就是

筛选字段在索引中的where条件

server层下推到storage engine层

,这样可以在

存储引擎层过滤数据

。由此可见,ICP可以

减少存储引擎访问基表的次数

mysql server访问存储引擎

的次数。

ICP使用的条件

  • 只能用于

    二级索引

    (secondary index)
  • explain显示的执行计划中

    type值

    (join 类型)为

    range

    ref

    eq_ref

    或者

    ref_or_null

  • 查询需要访问表的整行数据,即

    不能

    直接

    通过二级索引

    的元组数据获得

    查询结果

    (索引覆盖)
  • ICP可以用于

    MyISAM

    InnnoDB

    存储引擎,不支持分区表(5.7将会解决这个问题)

ICP优化功能的开启与关闭

index_condition_push

优化功能,

默认开启

MySQL5.6可以通过设置optimizer_switch([global|session],dynamic)变量开启或者关闭

mysql >

set optimizer_switch=’index_condition_pushdown=on|off’

用explain查看执行计划时,如果执行计划中的

Extra

信息为“

using index condition

”,表示优化器使用的ICP。

继续阅读