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,直到最后一行数据。

在这里插入图片描述
优化器使用ICP时,server层将会把能够通过使用索引进行评估的where条件下推storage engine层。数据访问和提取过程如下:

  1. storage engine从索引中读取下一条索引元组。

  2. storage engine使用索引元组评估下推的索引条件。如果没有满足where条件,storage engine将会处理下一条索引元组(回到上一步)。只有当索引元组满足下推的索引条件的时候,才会继续去基表中读取数据

  3. 如果满足下推的索引条件,storage engine通过索引元组定位基表的行和读取整行数据并返回给server层

  4. server层评估没有被下推到storage engine层的where条件,如果该行数据满足where条件则使用,否则丢弃。
    在这里插入图片描述

索引条件下推的意思就是筛选字段在索引中的where条件server层下推到storage engine层,这样可以在存储引擎层过滤数据。由此可见,ICP可以减少存储引擎访问基表的次数mysql server访问存储引擎的次数。

ICP使用的条件
  • 只能用于二级索引(secondary index)
  • explain显示的执行计划中type值(join 类型)为rangerefeq_ref或者ref_or_null
  • 查询需要访问表的整行数据,即不能直接通过二级索引的元组数据获得查询结果(索引覆盖)
  • ICP可以用于MyISAMInnnoDB存储引擎,不支持分区表(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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章