MST

星途 面试题库

面试题:MySQL中InnoDB的聚簇索引和非聚簇索引有何区别及对性能的影响

请阐述MySQL InnoDB存储引擎下聚簇索引和非聚簇索引在结构上的不同点,并且说明在数据查询、插入、更新和删除操作中,它们对性能分别会产生怎样不同的影响。
38.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

结构不同点

  • 聚簇索引
    • 数据和索引存储在一起,叶子节点包含了完整的行记录数据。
    • 按照主键顺序组织数据,一张表只能有一个聚簇索引。
  • 非聚簇索引
    • 数据和索引是分开存储的,叶子节点只包含索引列和指向聚簇索引的指针(即主键值)。
    • 可以有多个非聚簇索引,每个非聚簇索引都有自己的索引树结构。

操作性能影响

  • 数据查询
    • 聚簇索引:如果查询条件是主键,由于数据和索引在一起,直接在聚簇索引树上找到对应叶子节点就能获取完整数据,速度非常快。如果是范围查询,因为数据物理存储按主键顺序,也能快速定位相关数据范围,性能较好。
    • 非聚簇索引:查询索引列时,先在非聚簇索引树找到叶子节点获取主键值,然后再通过主键值去聚簇索引树查找完整数据,需要回表操作,性能相对聚簇索引查主键稍慢。但如果查询的列都包含在覆盖索引(即查询列都在非聚簇索引中)中,无需回表,性能也较好。
  • 插入操作
    • 聚簇索引:插入数据时,由于要按主键顺序插入到合适位置,如果插入位置在中间,可能需要移动大量数据,尤其是在数据量较大且插入位置不连续时,性能开销较大。如果主键是自增的,新数据会追加到聚簇索引树末尾,性能相对较好。
    • 非聚簇索引:插入操作只需要在非聚簇索引树上添加新的索引记录,并维护指针,对聚簇索引数据本身没有影响,一般插入性能比聚簇索引在非自增主键插入时好。但由于要维护多个索引结构,总体插入开销也会增加。
  • 更新操作
    • 聚簇索引:如果更新的是主键列,相当于删除旧记录并插入新记录,会导致聚簇索引树结构调整,性能开销大。如果更新非主键列,且不影响记录物理顺序,相对开销较小,但如果更新后导致记录物理位置改变,也会有较大开销。
    • 非聚簇索引:更新操作首先要在聚簇索引树上更新数据,然后可能需要更新相关的非聚簇索引记录(如果更新的列包含在非聚簇索引中),性能开销取决于更新列是否在非聚簇索引中以及聚簇索引数据更新的复杂度。
  • 删除操作
    • 聚簇索引:删除记录时,直接在聚簇索引树上删除,可能导致索引树的调整,尤其是删除中间记录时可能引发节点合并等操作,影响性能。如果删除的是叶子节点最后一条记录,对索引树结构影响相对较小。
    • 非聚簇索引:删除记录时,先在聚簇索引树上删除数据,然后再在相关非聚簇索引树上删除对应的索引记录,由于涉及多个索引结构的维护,总体性能开销会比单纯删除聚簇索引记录大。