后端完整解析58同城 MySQL

聚集索引和非聚集索引区别是什么?

区别应围绕叶节点存什么、表记录如何组织、回表路径和主键成本,而不是泛化为物理与逻辑索引。

面试后端互联网公司面经互联网中厂58同城database核心题完整解析编辑精选

直接结论

在 InnoDB 中,聚簇索引的叶节点就是表记录,表数据按该索引组织;通常使用主键作为聚簇键。二级索引的叶节点保存二级索引列以及对应的主键值,而不是通用意义上的物理行地址。因此二级索引命中后,如果所需列没有被该索引覆盖,还要用主键再查聚簇索引,这就是常说的回表。每张 InnoDB 表只有一种聚簇组织方式,却可以有多个二级索引。

原理与步骤

若表定义主键,InnoDB 使用它作为聚簇索引;没有主键时会选择合适的非空唯一索引,否则生成隐藏聚簇键。二级索引携带主键可以在行移动、页分裂时保持稳定定位,但也意味着宽主键会放大每个二级索引的空间。联合二级索引的列顺序决定可利用的前缀,并可能覆盖查询。唯一二级索引在允许 NULL 等情况下仍需结合 SQL 语义理解,不能仅凭“唯一”推断所有锁和访问行为。

工程场景

用户表以 bigint 主键聚簇,并建立 (email) 二级索引。查询仅需 id 和 email 时,二级索引已经包含两者,可覆盖返回;若还需要 profile 字段,则先从 email 叶节点取得 id,再回聚簇索引读取整行。列表页可设计 (tenant_id, created_at, id) 让过滤、排序和稳定翻页一起受益。主键应尽量短且稳定,因为更新聚簇键近似移动记录,并会牵涉所有二级索引中的主键引用。

验证与边界

“聚簇索引按主键物理连续存放”容易误导:页内有序且 B+Tree 逻辑有序,不代表磁盘扇区绝对连续。二级索引也不是“不存数据”,它存索引记录和主键。是否回表取决于查询列、索引可见性和执行计划;优化器也可能因成本选择其他路径。验证需用 SHOW CREATE TABLE、EXPLAIN ANALYZE、实际索引大小和读页指标,且结论限定于 InnoDB,不能直接套用到 MyISAM 或其他数据库。

答题练习

  1. 1聚簇叶节点保存整行
  2. 2二级叶节点包含主键
  3. 3覆盖索引可避免回表

常见错误

  • 把逻辑有序说成磁盘绝对连续
  • 认为二级索引只存指针不存键值

可能追问

  • 无主键时 InnoDB 如何选择聚簇键
  • 为什么宽主键会放大二级索引

来源记录

原始来源
小林coding
来源页面
58同城 Java 面试
最近收录
2026-07-05
官方复核
MySQL 官方文档