含义:首先我们要知道覆盖索引是什么意思,就是说我们索要查询的列要覆盖到索引列,之前在某度上搜到什么为了减少返回的列数,节省查询时间什么的,当然 这是一方面,但有个更重要的作用是为了让查询可以走索引;
现在我们有个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中使用到的索引查询结果满足了查询列,所以没有进行回表查询,提高了查询效率
注意:如果表内主键外所有列在同一组合索引内 那么无论怎么查都是会走索引的。