“秒懂”索引下推!原来索引下推这么简单!

开头
    在 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是怎样运行的》)

参考

五分钟搞懂MySQL索引下推——作者三分恶

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值