Skip to Content
面试题库Mysql[面试题] 什么是聚簇索引和非聚簇索引?

[面试题] 什么是聚簇索引和非聚簇索引?

📖 版块 A:知识讲解版 (温故知新)

  • 聚簇索引 (Clustered Index)

    1. 定义:不是一种单独的索引类型,而是一种数据存储方式。它将数据行与叶子节点存放在一起。
    2. 物理表现:在 InnoDB 存储引擎中,主键索引就是聚簇索引。一张表只能有一个聚簇索引。
    3. 结构:B+树的叶子节点存放的是完整的行记录。
  • 非聚簇索引 (Non-Clustered Index / Secondary Index)

    1. 定义:又称二级索引或辅助索引。索引的逻辑顺序与磁盘上数据的物理存储顺序不同。
    2. 物理表现:在 InnoDB 中,普通索引(如唯一索引、复合索引)都是非聚簇索引。
    3. 结构:B+树的叶子节点存放的是索引键值以及对应行记录的主键值
  • 关键差异点

    1. 查询效率:聚簇索引查询更快(直接获取行数据);非聚簇索引通常需要“回表”查询(除非是覆盖索引)。
    2. 数量限制:聚簇索引唯一,非聚簇索引可有多个。
    3. 叶子节点内容:聚簇索引存“行记录”,非聚簇索引存“主键值”。

🎤 版块 B:面试实战版 (高手逐字稿)

Q:什么是聚簇索引和非聚簇索引?

💬 高手逐字稿

简单来说,聚簇索引和非聚簇索引最核心的区别在于数据和索引是否在物理上存放在一起

在 MySQL 的 InnoDB 引擎中,聚簇索引的叶子节点直接存储了整行的数据。这就意味着,当我们通过主键查询时,只要定位到了叶子节点,就直接拿到了数据,不需要额外的磁盘 I/O。因为物理顺序和索引顺序一致,一张表只能有一个聚簇索引,默认就是主键。

而非聚簇索引,也就是我们常说的二级索引,它的叶子节点存储的是索引列的值以及对应的主键值。比如我们给 name 字段加了索引,通过 name 查询时,它会先在 name 的 B+ 树里找到对应的主键 ID,然后再拿着这个 ID 去主键索引的 B+ 树里找具体的行记录,这个过程就是回表

这里其实涉及到一个非常关键的性能优化点。如果我的查询语句中,Select 的字段已经包含在了索引里(比如复合索引或者只查主键),那么引擎就直接在二级索引里返回结果了,不需要回表,这就是覆盖索引,这在生产环境中是提升查询效率的重要手段。

另外有一个细节容易被忽略:如果我们在建表时没有显式定义主键,InnoDB 会自动选择一个非空的唯一索引作为聚簇索引;如果连唯一索引也没有,它会隐式地生成一个 6 字节的 rowid 作为聚簇索引。所以从架构设计上讲,InnoDB 的表本质上就是索引组织表,数据本身就是索引的一部分。

这也是为什么在 InnoDB 中,我通常建议主键要尽量递增。因为聚簇索引的叶子节点是有序的,递增主键可以避免插入时频繁的页分裂,保证 B+ 树的写入效率。相比之下,MyISAM 引擎就不存在聚簇索引,它的索引和数据是分开存储的,索引叶子节点存的是指向数据物理地址的指针。

最后更新于:
⏱️

登录后开始阅读

当前 MVP 版本只开放邮箱密码登录注册。完成登录后即可进入面试题内容。

还没有账号?先去注册