1.问题引入
有下表,name,cid字段是联合索引
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
`did` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_cid_INX` (`name`,`cid`),
KEY `name_INX` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
2.如何将cid用上索引
EXPLAIN SELECT name, cid FROM student WHERE cid=1;
说明用上了索引。但是这个索引是覆盖索引!!!!
覆盖索引其实是一种特殊的联合索引,怎么理解呢,即是你查询的字段的所有数据都在索引上,不需要再进行一次回表查询,这样的索引即为覆盖索引
所以说,只要我们查询的内容是联合索引包含的字段,那么我们就可以单独使用某个字段进行查询走索引
3.再走一次联合索引看看,区别如何
EXPLAIN SELECT name, cid FROM student WHERE name='小红' AND cid=1;
这两种的区别type是不一样的,覆盖索引是Index,联合索引是ref
再走一例子
EXPLAIN SELECT name FROM student WHERE name='小红' ;
因此可以得出我们优先走联合索引而不是覆盖索引。