mysql-索引-索引条件下推(ICP)
定义
索引条件下推(ICP), Index condition pushdown,简单的来讲,使用索引查询后,不立即进行回表查询,通过where条件中的字段(该字段也是位于索引中)进行过滤,将过滤之后的结果进行回表查询。相对于没有开启ICP,减少了回表查询的记录数
例子
来自官网
假设一个表包含有关人员及其地址的信息,并且该表的索引定义为INDEX(zipcode,lastname,firstname)。如果我们知道一个人的zipcode值但不确定姓氏,我们可以这样搜索:
SELECT * FROM people
WHERE zipcode='95054'
AND lastname LIKE '%etrunia%'
AND address LIKE '%Main Street%';
MySQL可以使用索引来扫描zipcode=‘95054’的人。第二部分(姓氏LIKE’%etrunia%’)不能用于限制必须扫描的行数,因此如果没有ICP,此查询必须为所有拥有zipcode ='95054’的人检索完整的表行。
使用ICP后,MySQL在读取整个表行之前检查姓氏LIKE’%etrunia%'部分。这样可以避免读取与zipcode条件匹配的索引元组对应的完整行,但不会读取lastname条件
默认情况下启用索引条件下推。可以使用optimizer_switch系统变量通过设置index_condition_pushdown标志来控制:
SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';