为什么要用索引覆盖

含义:首先我们要知道覆盖索引是什么意思,就是说我们索要查询的列要覆盖到索引列,之前在某度上搜到什么为了减少返回的列数,节省查询时间什么的,当然 这是一方面,但有个更重要的作用是为了让查询可以走索引;

现在我们有个user表,组合索引为A,B,C三列 

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` varchar(255) NOT NULL,
  `a` varchar(255) DEFAULT NULL,
  `b` varchar(255) DEFAULT NULL,
  `c` varchar(255) DEFAULT NULL,
  `d` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `group_abc` (`a`,`b`,`c`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('123123', '123', '123', '123', null);

如果我们查询为 desc select * from user WHERE a = '123' AND b = '123' and c = '123'  ,那么组合索引查询遵循最左原则,是会走组合索引的

但是如果我们以b,c两列作为查询条件(desc select * from user WHERE b = '123' and c = '123') ,那么这时候没有遵循最左原则,执行计划中的key列(实际用到的索引就是空的) 也就是没有走索引  

但是作为mysql一种优化  如果我们将查询列改为组合索引当中的后两列(此时违背最左匹配原则)  desc select b,c from user WHERE b = '123' and c = '123' 此时在执行计划中 possible_key(可能用到的索引)是空的,但是实际用到的索引是A,B,C创建的组合索引,这个是mysql当中的一个优化。

此外查询列对索引进行覆盖的话还有个好处,就是避免回表;

desc select * from user where a= '123' and b = '123';

此时查看执行计划,查询条件符合最左原则,possible_keys和key是一样的,但是Extra列是空的,那就是说明在查询列是 * 的情况下我们做组合索引查询到的数据不符合查询列所需要的数据,那么就会根据当前组合索引(非聚集索引或二级索引)查询出来的id去聚集索引中查询,这个查询动作叫做--------回表查询;

但是,如果说我们查询的条件为 a,b,c 

 desc select a,b,c from user where a= '123' and b = '123';  可以看到执行计划当中没有任何变化,但是需要注意Extra列中提示的是Using index;这个提示就是说明此条sql中使用到的索引查询结果满足了查询列,所以没有进行回表查询,提高了查询效率

注意:如果表内主键外所有列在同一组合索引内  那么无论怎么查都是会走索引的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值