排序问题
最近看了极客时间上 《MySQL实战45讲》,纠正了一直以来对 InnoDB 二级索引的一个理解不到位,正好把相关内容总结下。PS:本文的所有测试基于 MySQL 8.0.13 。
先把问题抛出来,下面的 SQL 所创建的表,有两个查询语句,哪个索引是非必须的?
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;
select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;
作者给的答案是索引 c 和 ca 的数据模型是一样的,因此 ca 是多余的。为啥??
我们知道,二级索引里存放的不是行的位置,而是主键的值,也知道索引是有序的。
如果 c 与 ca 的数据模型一样,那么就要求二级索引的叶子节点不仅是按索引列排序、而且还按关联的主键值进行排序。
我以前的理解是 二级索引只按索引列进行排序,主键值是不排序的。
问了专栏作者,得到的答复是:索引 c 就是按照 cab 这样排序,(二级索引))有保证主键算进去、还是有序的。(PS:非原话,前后问了三次得到)。
本着 先问是不是,再问为什么 的思路,进行一番探究。