标准答案
- 聚簇索引的叶子节点就是数据页,因此一个表通常只有一种物理聚簇顺序。
- 二级索引的叶子节点通常保存索引列和主键值,先命中二级索引后再通过主键读取数据行。
- 查询所需列若都在二级索引中,就可以成为覆盖索引,避免第二次读取。
- 主键越宽,二级索引携带的主键值越大,缓存命中和写放大都会变差。
- 索引设计要以真实查询为准,不能为了避免回表把所有列都塞入每个索引。
题目解析
回表不是错误,而是一种正常的两阶段访问。问题出在先通过低选择性条件命中了海量索引项,再对每一项回表取宽行,随机 I/O 和 CPU 会迅速累积。
覆盖索引适合高频、返回字段少且稳定的查询,例如列表页只读取 ID、状态和创建时间。它要权衡写入成本和索引体积,不能把整个实体复制进索引。
常见误区
- 认为二级索引一定比聚簇索引慢,而不看过滤选择性和返回列。
- 为了消灭回表建立超宽联合索引,导致每次写入和缓存都被拖慢。