InnoDB 的二级索引里,藏着主键
我一直以为二级索引的叶子上只存索引列,其实每条记录后面都跟着主键。InnoDB 正是拿这个主键回表,去主键索引里取整行。
CREATE TABLE geek (
a INT, b INT, c INT, d INT,
PRIMARY KEY (a, b),
KEY c (c)
);
-- 索引 c 的叶子实际存的是 (c, a, b)所以 WHERE c = 1 ORDER BY a 不用再建 (c, a):c 相同的记录本来就按 a 排好了。ORDER BY b 才需要另建 (c, b)。
两个细节:
- 主键里已经出现在索引中的列不会存两遍。
- 查询要的列在叶子上全都有(包括主键),就不用回表,这就是覆盖索引。