索引的类型聚簇和二级讲讲他们的关系?
1 个回答
态度本身也是答案的一部分。古尘## 1. 聚簇索引(Clustered Index) **定义** * 表数据本身按照索引的顺序存储。 * **索引和数据是绑在一起的**,索引的叶子节点就存放了完整的行数据。 **特点** 1. 一张表只能有 **一个** 聚簇索引。 2. InnoDB 默认用 **主键** 作为聚簇索引;如果没有主键,会选择一个唯一非空索引;如果也没有,就生成一个隐藏的 `row_id`。 3. 查询主键范围时非常快,因为数据在物理上就是有序存放的。 **示意** ``` 叶子节点: (主键=101, name=Tom, age=20) (主键=102, name=Jerry, age=21) ``` ## 2. 二级索引(Secondary Index / 非聚簇索引) **定义** * 索引的叶子节点不存放整行数据,而是存放 **主键值**。 * 查询时要通过二级索引的主键值回到聚簇索引再拿到完整数据,这个过程叫 **回表**。 **特点** 1. 一张表可以有多个二级索引。 2. 占用空间比聚簇索引少,因为不存全行数据。 3. 如果查询的列全部包含在二级索引里(覆盖索引),就可以不回表。 **示意** ``` 二级索引(按 name 排序) 叶子节点: (name=Jerry, 主键=102) (name=Tom, 主键=101) ``` ## 3. 二者关系 1. **依赖关系** * InnoDB 的二级索引的叶子节点必须保存主键值,因此二级索引依赖聚簇索引才能找到完整记录。 * 所以二级索引的结构里,其实包含了“索引列 + 主键列”。 2. **查询过程** * 直接用聚簇索引:一次 IO 就能拿到数据(因为叶子节点就是数据)。 * 用二级索引:先在二级索引找到主键,再去聚簇索引查数据 → 至少两次 IO。 3. **更新代价** * 更新主键值 → 聚簇索引和所有二级索引都要改,因为二级索引里存着主键值。 * 更新二级索引列 → 只需要改二级索引的 B+Tree。 ## 4. 总结对比表 | 对比项 | 聚簇索引 (Clustered) | 二级索引 (Secondary) | | ------ | ---------------- | ---------------- | | 叶子节点存储 | 行数据 | 主键值 | | 查询性能 | 直接拿数据,速度快 | 可能需要回表,多一次 IO | | 个数限制 | 一张表一个 | 多个 | | 空间占用 | 大(存全行数据) | 小(存主键+索引列) | | 依赖关系 | 无需依赖 | 依赖聚簇索引 |发布于 2025-08-13 04:52 •IP属地 陕西举报评论收藏
公众号进入网站体验更佳

