聚簇索引决定数据物理存储顺序,叶子节点存完整数据行,每表仅一个,InnoDB默认主键为聚簇索引;非聚簇索引叶子节点存主键值,需回表查询,可建多个,提升查询效率但有额外开销。

在 MySQL 中,聚簇索引和非聚簇索引的主要区别在于数据的存储方式以及索引与实际数据行之间的关系。这个区别在使用 InnoDB 存储引擎时尤为明显,因为 MyISAM 不支持聚簇索引。
聚簇索引(Clustered Index)
聚簇索引决定了表中数据行的物理存储顺序。也就是说,数据行是按照聚簇索引的键值来排列存储的。
- InnoDB 引擎默认使用主键作为聚簇索引。如果你没有定义主键,InnoDB 会尝试使用一个唯一的非空索引;如果也没有,它会隐式创建一个 6 字节的隐藏主键。
- 由于数据行本身存储在索引的叶子节点中,因此每张表只能有一个聚簇索引。
- 通过聚簇索引查询数据非常高效,因为找到索引就等于找到了数据。
- 范围查询、排序操作在聚簇索引上通常表现更好,因为数据在磁盘上是连续存放的。
非聚簇索引(Secondary Index / Non-Clustered Index)
非聚簇索引不决定数据的物理存储顺序。它的叶子节点并不包含完整的数据行,而是包含对应数据行的主键值。
- 当你在一个非主键列上创建索引时,InnoDB 创建的就是非聚簇索引。
- 查找数据时,先通过非聚簇索引找到主键值,再通过主键去聚簇索引中查找完整数据行,这个过程称为“回表”。
- 一张表可以有多个非聚簇索引,适合用于各种查询条件。
- 虽然查询效率略低于聚簇索引(需要额外一次索引查找),但能显著加快 WHERE、JOIN、ORDER BY 等操作。
关键对比
存储内容:聚簇索引的叶子节点存放的是完整的数据行;非聚簇索引的叶子节点存放的是主键值。
数量限制:每张表只能有一个聚簇索引,但可以有多个非聚簇索引。
查询性能:聚簇索引查询更快,尤其是范围扫描;非聚簇索引需要回表,多一次查找开销。
插入和更新影响:聚簇索引对插入顺序敏感,若主键无序可能导致页分裂;非聚簇索引更新时需同步维护多个索引结构。
基本上就这些。理解它们的区别有助于合理设计主键和索引,提升查询性能。比如选择自增主键通常更利于聚簇索引的写入效率,而为常用查询字段添加非聚簇索引可加速检索。










