背景

05.深入浅出索引(下).pdf 的课后题

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;

这个表中存在 ca 和 cb 两个联合索引的原因是有下面两个业务向 SQL 语句。

select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;

那么根据这两个 SQL 语句,有没有索引是可以删除掉的呢?

二级索引下叶子结点的存储形式

二级索引下,叶子结点是存放二级索引的索引值,再增加主键值。

当主键为联合索引时,就会配置对应列数的主键值。

而当二级索引中含有主键的部分列时,后面主键就会省略掉对应列。

假设数据表中的数据为

–a--|–b--|–c--|–d--
1 2 3 d
1 3 2 d
1 4 3 d
2 1 3 d
2 2 2 d
2 3 4 d

索引 ca 的组织是先按 c 排序,再按 a 排序,同时记录主键。

–c--|–a--|–主键部分b-- (这里只有b)
2 1 3
2 2 2
3 1 2
3 1 4
3 2 1
4 2 3

此时,ca 索引在叶子结点中的存储形式是和 c 索引相同。

由于非叶子结点上,ca 索引在非叶子结点上存储数据量大于 c 索引,并且当前使用 ca 索引的 SQL 语句也仅仅关注于叶子结点效果,所以,可以省略掉 ca 索引。

cb 索引就必须要保留了。