书接上回,既然索引那么重要,那我们在创建索引的时候应该怎么选择?
CREATE TABLE `geek` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` int(11) NOT NULL,
`d` int(11) NOT NULL,
PRIMARY KEY (`a`,`b`),
KEY `c` (`c`),
KEY `ca` (`c`,`a`),
KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;
我们在创建表geek的时候创建了4个索引,分别是主键索引,索引c、ca、cb。
当下场景里,涉及的查询语句为:
-- 查询语句1
select * from geek where c=N order by a limit 1;
-- 查询语句2
select * from geek where c=N order by b limit 1;
查询语句1,我们需要对c,a字段进行排序。
查询语句2,我们需要对c,b字段进行排序。
针对这两个语句,请你来分析一下上面这四个索引是否合理:
再回答问题之前,我们先复习一下索引的类型;
mysql中的索引分为主键索引和非主键索引。
主键的作用是存储数据,非主键索引索引的作用是加快查询速度。
主键索引上存储的是磁盘上数据的地址,非主键索引上存储的是主键ID,对于非主键索引,当我们要查询的字段很多,仅仅依靠索引字段无法满足查询要求的时候,就会涉及到一个回表的操作。
回表:非主键索引利用叶子结点上的主键ID去主键索引上查询数据的过程。
有了上述知识,我们就能很快回答出来索引c,a是多余的,我们通过索引c就可以定位到数据的主键索引,主键索引a,b中又是按照a,b字段进行排序的,因此c,a索引是多余的。