索引条件下推(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)定位和读取整行数据。
-
server层评估where条件
,如果该行数据满足where条件则使用,否则丢弃。 -
循环执行1
,直到最后一行数据。
优化器使用ICP时
,server层将会把能够通过使用索引进行评估的where条件下推
到storage engine
层。数据访问和提取过程如下:
-
storage engine从索引中读取下一条索引元组。
-
storage engine使用索引元组评估下推的索引条件。如果
没有满足where条件
,storage engine将会处理下一条索引元组(回到上一步)
。只有当索引元组满足下推的索引条件
的时候,才会继续去基表中读取数据
。 -
如果
满足下推的索引条件
,storage engine通过索引元组定位基表的行和读取整行数据并返回给server层
。 -
server层评估没有被下推到storage engine层的where条件
,如果该行数据满足where条件则使用,否则丢弃。
索引条件下推的意思就是筛选字段在索引中的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。