聚簇索引 & 非聚簇索引
2025年4月8日大约 3 分钟
聚簇索引 & 非聚簇索引
聚簇索引
定义
- 聚簇索引是指数据表中的数据按照索引的顺序排列,索引的叶子节点储存的不仅是索引列的值,还存储整行数据。
- 每张表只能有一个聚簇索引,因为数据物理上只能有一种排列顺序。
特点
- 在 InnoDB 中,主键索引就是聚簇索引,InnoDB 会自动将主键列作为聚簇索引。
- 如果没有定义主键,InnoDB 会尝试使用一个唯一的非空索引作为聚簇索引,如果表中没有主键或者唯一非空索引,InnoDB 会自动隐式生成一个
row_id
作为聚簇索引。
工作原理
- 聚簇索引的叶子节点存储的是完整的数据。因此通过聚簇索引进行查询时,可以直接从索引中找到需要的数据,不需要额外查找步骤。
- 由于数据和索引一起存储,按主键查询非常高效,查询过程就是遍历聚簇索引找到数据的过程。
优点
- 范围查找:由于数据储存在索引的叶子节点中,查询非常快,特别是范围查询效率高,因为数据物理上按顺序存储。
- 查询效率高,避免二次查找:因为聚簇索引中包含完整数据,某些查询只需要使用聚簇索引就能完成,避免二次查找。
缺点
- 插入和更新代价高:由于数据按照索引顺序存储,插入新数据时可能需要调整数据存储位置来维护顺序,因此插入效率比非聚簇索引低。
- 大字段影响性能:如果表中包含大字段,它们存储在叶子节点中会导致索引体积变大、性能下降。
非聚簇索引
定义
- 非聚簇索引是指索引和数据时分开存储的。非聚簇索引的叶子节点存储的是索引列的值和指向实际数据的指针(行号或主键)。
- 一张表可以有多个非聚簇索引,每个索引都有自己的存储顺序。
特点
- 非主键索引在 InnoDB 中就是非聚簇索引,这些索引的叶子节点存储的是索引列的值以及对应的主键值,而不是直接存储数据。
工作原理
- 非聚簇索引的叶子节点存储的时索引列的值和指向数据的指针。在 InnoDB 中,这个指针就是该行对应的主键值。 因此在使用非聚簇索引时,MySQL 需要先通过非聚簇索引找到主键值,在通过主键值回到聚簇索引找到实际数据(回表)。
优点
- 对于特定列的查询查找速度快:非聚簇索引可以加速对索引列的查找,尤其是对经常作为查询条件的列建立非聚簇索引,可以大大提高查询性能。
- 灵活性高:一张表可以有多个非聚簇索引,可以加速不同类型的查询。
缺点
- 查询效率低,需要回表:非聚簇索引查询时需要通过索引找到主键,再去聚簇索引查找实际数据。这个过程比直接使用聚簇索引慢。
- 额外存储:非聚簇索引需要额外创建索引树,占用更多磁盘空间。