索引条件下推(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时
,数据访问和提取的过程如下:
- 当storage engine读取下一行时,首先读取索引元组(index tuple),然后使用索引元组在基表中(base table)定位和读取整行数据。
-
,如果该行数据满足where条件则使用,否则丢弃。server层评估where条件
-
,直到最后一行数据。循环执行1

优化器
使用ICP时
,server层将会把
能够通过使用索引进行评估的where条件下推
到
storage engine
层。数据访问和提取过程如下:
- storage engine从索引中读取下一条索引元组。
- storage engine使用索引元组评估下推的索引条件。如果
,storage engine将会没有满足where条件
。只有当索引元组处理下一条索引元组(回到上一步)
的时候,才会继续去满足下推的索引条件
。基表中读取数据
- 如果
,storage engine通过索引元组定位基表的行和满足下推的索引条件
。读取整行数据并返回给server层
-
,如果该行数据满足where条件则使用,否则丢弃。server层评估没有被下推到storage engine层的where条件
Mysql知识延展(三)索引条件下推
索引条件下推的意思就是
筛选字段在索引中的where条件
从
server层下推到storage engine层
,这样可以在
存储引擎层过滤数据
。由此可见,ICP可以
减少存储引擎访问基表的次数
和
mysql server访问存储引擎
的次数。
ICP使用的条件
- 只能用于
(secondary index)二级索引
- explain显示的执行计划中
(join 类型)为type值
、range
、ref
或者eq_ref
ref_or_null
- 查询需要访问表的整行数据,即
直接不能
的元组数据获得通过二级索引
(索引覆盖)查询结果
- ICP可以用于
和MyISAM
存储引擎,不支持分区表(5.7将会解决这个问题)InnnoDB
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。