一、InnoDB存储引擎中,聚簇索引 和 非聚簇索引(也称为二级索引)都是重要的组成部分:
1. 聚簇索引:
每个InnoDB表都有一个聚簇索引,它通常位于主键上。如果没有明确定义主键,InnoDB会选择一个唯一的非空索引作为聚簇索引,或者创建一个隐藏的聚簇索引来存储行数据。
聚簇索引的特点是,非主键列的值会根据聚簇索引的顺序存储在叶子节点上,这意味着聚簇索引的叶子节点包含了非索引列的所有数据。
2. 非聚簇索引:
非聚簇索引或二级索引不包含所有的行数据。它们只包含索引列的值和主键列的值(或隐藏聚簇索引的行定位器)。
当通过非聚簇索引查找数据时,InnoDB首先在二级索引中找到主键值,然后根据这个主键值去聚簇索引中查找完整的行数据。(这里也就是回表)
InnoDB的索引结构允许它在不同的索引上执行高效的查找、范围查询和排序操作。聚簇索引和非聚簇索引共同工作,提供了灵活的数据访问方式,优化了查询性能。
聚簇索引和非聚簇索引在InnoDB中的使用是自动的,用户不需要手动配置,只需定义表结构和索引即可。InnoDB会根据这些定义自动维护索引结构,并在查询操作中使用它们。
二、回表:
非聚簇索引 通过主键值去聚簇索引 中查询数据的过程通常被称为“回表”。
这里是这个过程的详细说明:
1. **非聚簇索引查询**:当执行一个基于非聚簇索引的查询时,数据库首先在二级索引中查找,这个索引只包含非主键列的值和对应的主键值(或行定位器)。
2. **获取主键值**:在二级索引的叶子节点中,查询会找到与搜索条件匹配的主键值。
3. **回表**:一旦有了主键值,数据库接下来会在聚簇索引中使用这个主键值进行查找。这个过程就是所谓的“回表”,因为数据库从二级索引“回退”到主索引来检索完整的行数据。
4. **检索行数据**:在聚簇索引中,根据主键值找到具体的行数据,完成查询。
回表是数据库查询优化的一部分,数据库查询优化器会评估使用非聚簇索引和聚簇索引的成本,选择一个最有效的查询路径。如果二级索引能够显著减少需要扫描的数据量,即使需要额外的回表步骤,使用二级索引也可能是更优的选择。