标准答案

  1. 聚簇索引的叶子节点就是数据页,因此一个表通常只有一种物理聚簇顺序。
  2. 二级索引的叶子节点通常保存索引列和主键值,先命中二级索引后再通过主键读取数据行。
  3. 查询所需列若都在二级索引中,就可以成为覆盖索引,避免第二次读取。
  4. 主键越宽,二级索引携带的主键值越大,缓存命中和写放大都会变差。
  5. 索引设计要以真实查询为准,不能为了避免回表把所有列都塞入每个索引。

题目解析

回表不是错误,而是一种正常的两阶段访问。问题出在先通过低选择性条件命中了海量索引项,再对每一项回表取宽行,随机 I/O 和 CPU 会迅速累积。

覆盖索引适合高频、返回字段少且稳定的查询,例如列表页只读取 ID、状态和创建时间。它要权衡写入成本和索引体积,不能把整个实体复制进索引。

常见误区

  • 认为二级索引一定比聚簇索引慢,而不看过滤选择性和返回列。
  • 为了消灭回表建立超宽联合索引,导致每次写入和缓存都被拖慢。

作者信息