1.介绍
Index Condition Pushdown(ICP)是针对MySQL使用索引从表中检索行的情况进行的优化。
在没有ICP的情况下,存储引擎遍历索引以定位基表中的行,并将它们返回给MySQL服务器,MySQL服务器会评估这些行的WHERE条件。
启用ICP后,如果仅使用索引中的列就可以计算WHERE条件的一部分,MySQL服务器会将WHERE条件的这一部分推送到存储引擎。然后,存储引擎通过使用索引条目来评估推送的索引条件,只有当满足这一条件时,才从表中读取行。ICP可以减少存储引擎必须访问基表的次数和MySQL服务器必须访问存储引擎的次数。
2.触发限制
指数条件下推优化的适用性受以下条件的约束:
要了解此优化是如何工作的,请首先考虑在不使用“索引条件下推”时索引扫描是如何进行的:
使用索引条件下推,扫描按如下方式进行:
EXPLAIN输出显示当使用索引条件下推时,在Extra列中使用索引条件。它不显示Using index,因为当必须读取完整的表行时,这不适用。
3.示例
假设一个表包含有关人员及其地址的信息,
并且该表有一个定义为index(zipcode,lastname,firstname)的索引。如果我们知道一个人的邮政编码值,但不确定他的姓氏,我们可以这样搜索:
SELECT * FROM people
WHERE zipcode='95054'
AND lastname LIKE '%etrunia%'
AND address LIKE '%Main Street%';
MySQL可以使用索引扫描zipcode='95054'的人。
第二部分(lastname LIKE“%etrunia%”)不能用于缩小必须扫描的行数,因此如果没有索引条件下推,此查询必须为所有邮政编码为“95054”的人检索完整的表。
使用Index Condition Pushdown,MySQL在读取完整的表行之前检查姓氏LIKE“%etrunia%”部分。这样可以避免读取与zipcode条件匹配但与lastname条件不匹配的索引元组对应的完整行。
默认情况下,“索引条件下推”处于启用状态。
可以通过设置index_condition_pushdown标志,使用optimizer_switch系统变量进行控制:
SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';