面试题答案
一键面试结构区别
- 聚簇索引:聚簇索引的叶子节点包含了完整的行记录数据。InnoDB 表是按聚簇索引组织的,数据行和主键值紧密关联,整个表的物理存储顺序与聚簇索引的顺序一致。
- 非聚簇索引:非聚簇索引的叶子节点存储的是索引键值和对应的主键值(在 InnoDB 中)。非聚簇索引的结构和聚簇索引类似,但叶子节点不包含完整的行记录,只是指向聚簇索引的指针(通过主键值)。
数据存储方式区别
- 聚簇索引:数据按照聚簇索引的键值顺序存储,物理上相邻的记录在逻辑上也相邻。由于数据和索引存储在一起,因此插入、更新和删除操作可能会导致页分裂和数据移动,开销相对较大。
- 非聚簇索引:数据存储顺序和非聚簇索引顺序无关。非聚簇索引只是提供了一种快速定位数据的方式,通过索引找到主键值后,还需要再通过聚簇索引(回表操作)来获取完整的行记录数据。
查询性能区别
- 聚簇索引:
- 优点:如果查询条件是聚簇索引列,或者查询结果集是按照聚簇索引顺序返回,那么查询性能非常高,因为可以直接从叶子节点获取完整的行记录,无需额外的回表操作。例如,按主键范围查询,可以快速定位和获取数据。
- 缺点:当查询条件不是聚簇索引列时,可能需要全表扫描,性能较差。
- 非聚簇索引:
- 优点:对于包含非聚簇索引列的查询,能够快速定位到对应的主键值。如果查询只需要返回索引列(覆盖索引情况),则不需要回表,查询性能较好。例如,查询索引列的统计信息等。
- 缺点:如果查询需要获取完整的行记录数据,除了扫描非聚簇索引,还需要根据主键值回表查询聚簇索引,增加了 I/O 开销,性能相对较差。特别是在高并发场景下,回表操作可能导致大量的随机 I/O,影响性能。