MySQL

InnoDB 的二级索引里,藏着主键

我一直以为二级索引的叶子上只存索引列,其实每条记录后面都跟着主键。InnoDB 正是拿这个主键回表,去主键索引里取整行。

sql
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)。

两个细节:

  • 主键里已经出现在索引中的列不会存两遍。
  • 查询要的列在叶子上全都有(包括主键),就不用回表,这就是覆盖索引。
esc