背景
mysql 5.6支持的ICP,ICP主要减少了存储引擎访问磁盘基表的次数和mysql服务层访问存储层的次数,ICP可以处理一些组合索引的一些失效的场景,如果没有ICP的话,就需要mysql存储引擎把符合条件的索引的全部数据取出来,然后再mysql服务层进行过滤,有点像 limit 100000,10 取出100010,过滤掉100000 一样的效果
CREATE TABLE `shop_info` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '表ID,主键',
`shop_code` varchar(50) NOT NULL DEFAULT '' COMMENT '店铺编码--目前存储的是跟名称一样的值,不能做唯一的值',
`shop_name` varchar(50) NOT NULL DEFAULT '' COMMENT '店铺名称',
`channel` varchar(10) NOT NULL DEFAULT '' COMMENT '店铺渠道(平台名),存储的是编码',
PRIMARY KEY (`id`),
KEY `idx_channel_shop_code` (`channel`,`shop_code`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='店铺信息';
从上面可以看出来channel 和shop_code 建立了联合索引,可以看出默认是支持ICP的;
## 把ICP关闭
set @@optimizer_switch='index_condition_pushdown=off';
如果执行计划中extra 的字段的值有 Using where,就是需要mysql服务层进行过滤的