Index Condition Pushdown(ICP)是MySQL 5.6中新特性,是一种在存储引擎层使用索引过滤数据的优化方式。
默认情况下启用索引条件下推。可以通过设置系统变量optimizer_switch控制:
index_condition_pushdown
#关闭索引下推
SET optimizer_switch = 'index_condition_pushdown=off' ;
#开启索引下推
SET optimizer_switch = 'index_condition_pushdown=on ';
当使用索引条件下推时,EXPLAIN语句输出结果中Extra列内容显示为Using index condition。
建表
CREATE TABLE people`(
'id` int NOT NULL AUTO_INCREMENT,
'zipcode' varchar(20)COLLATE utf8_bin DEFAULT NULL,
'firstname ' varchar(20)COLLATE utf8_bin DEFAULT NULL,
'lastname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
`address' varchar( 50)COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY ( id `),
KEY‘zip_last_first’( zipcode `, 'lastname ' , `firstname ')
)ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
插入数据
INSERT INTO 'people` VALUES
( '1', '008801', '三','张','北京市'),
( '2', '000002', '四','李','南京市'),
( '3', '888003', '五','王','上海市'),
( '4', '000001', '六', '赵','天津市');
为该表定义联合索引zip_last_first (zipcode,lastname,firstname)。如果我们知道了一个人的邮编,但是不确定这个人的姓氏,我们可以进行如下检索:
SELECT * FROM people
WHERE zipcode= '088001'
AND lastname LIKE '%张%'
AND address LIKE '%北京市%';
执行查看sQL的查询计划,Extra中显示了Using index condition,这表示使用了索引下推。另外,Usingwhere表示条件中包含需要过滤的非索引列的数据,即address LIKE %北京市%'这个条件并不是索引列,需要在服务端过滤掉。