回答
聚簇索引的叶子节点数据行与键值存储在一起。在 InnoDB 中,聚簇索引通常就是主键索引,一张表只有一个聚簇索引。聚簇索引是一种数据存储方式,而不是新的索引类型。
二级索引的叶子节点内容是主键的值。在 InnoDB 中,非主键索引称为二级索引,二级索引的键值和数据不在一棵树上。通常来说,基于 MySQL 二级索引的检索是先通过二级索引找到主键索引的键值,再通过主键值查询主键索引。
扩展
聚簇索引和二级索引检索过程
通过聚簇索引来查询数据时,InnoDB可以利用索引树(B+树)来定位到具体的数据页。由于聚簇索引的数据行与索引是存储在一起的,所以一旦找到了索引项,那么对应的数据也就找到了。
而二级索引的检索和数据不是存储在一起的,所以会涉及到一个回表的过程。现在二级索引中找到对应的聚簇索引键,然后再使用这个聚簇索引键在聚簇索引的B+树中查找到完整的数据行。
聚簇索引特点
- **定义与生成:**默认情况 InnoDB 用主键作为聚簇索引。当表没有定义主键时,InnoDB 会将表中第一个 NOT NULL 的
UNIQUE index
作为聚簇索引。当表既没有主键也没有合适的唯一索引,InnoDB 会隐式地生成名为GEN_CLUST_INDEX
包含 row ID 值的聚簇索引。 - 唯一性:聚簇索引也是主键索引,一张表只能有一个聚簇索引。
- 加速查询:聚簇索引已经包含行数据,定位到索引键便可获取行数据。二级索引需先搜索自身的索引树得到主键,再到聚簇索引(主键索引)树搜索一次,这个过程称为回表。相较而言,二级索引检索多了一次磁盘 IO 开销。
- **二级索引关系:**非主键索引称为二级索引,二级索引的每条记录都包含主键列。如果主键较长,那么二级索引会占用更多空间,相同大小的磁盘数据页存储的数据变少。故在 InnoDB 中,定义合适自增的主键至关重要。