开头
在 MySQl5.6 版本中,带来了 index condition pushdown,简称ICP,也就是大名鼎鼎的索引下推
。索引下推不像覆盖索引那么好理解,今天就带你秒懂索引下推
!
先来一个建表语句
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
# 建立(name,age)联合索引
KEY `index_name_age` (`name`,`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
来点数据
INSERT INTO `user` VALUES (1, '张三', 18);
INSERT INTO `user` VALUES (2, '张四', 20);
来一个查询语句
SELECT * FROM `user` WHERE name LIKE "张%" AND age=18;
这样是否用到了索引下推
呢?
答案是,用到了(注意!!!这里示例的数据过少,实际不会走索引,这里不考虑数据量的问题)为什么这样算用到了索引下推呢?下面我们来分析一下。
分析:
1、根据最左匹配原则
,name LIKE "张%"可以走索引,但是age=18无法走索引,因为由于name LIKE "张%"走了索引,导致age此时已经是非有序的了,剩下的索引就没办法走了,性价比太低了,这就导致了在联合索引这个二级索引中找到了两条数据(id=1,id=2),需要回表两次。要知道回表是非常损耗性能的。
2、索引下推
推出以后,优化器就多了一个选择,就是让存储引擎逐个扫描两条数据(id=1,id=2),筛选出符合 age=18 的数据,这样最终只得到了一个数据,只需要回表一次。
总结
总结下来就是,索引下推
逐个扫描并筛选数据花费的时间<索引下推
减少的回表次数从而节省的时间,即 后者时间-前者时间>0
,那么就会使用索引下推
来优化查询性能。
要记住,MySQL查询语句的优化,就是基于成本的,谁便宜就选谁!(出自《MySQL是怎样运行的》)
参考