背景
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 索引就必须要保留了。