聚簇索引=主键索引吗?¶
一、概念定义¶
在 InnoDB 引擎中,每张表都会有一个特殊的索引 —— 聚簇索引(Clustered Index),也称为聚集索引,它是用来存储行数据的。
常见误区¶
聚簇索引 = 主键索引?
答案:不完全等于。
- 一般情况下,聚簇索引等同于主键索引
- 前提条件:这张表需要有主键
关键点¶
聚簇索引并不完全等于主键索引,因为一张表从结构上来讲可以没有主键。
如果没有主键(索引),那么: - 聚簇索引不再是主键索引 - 会选择其他索引作为聚簇索引 - 或者生成隐藏的聚簇索引
二、聚簇索引的诞生过程¶
在 InnoDB 引擎下,聚簇索引的诞生过程如下:
第1步:有主键¶
当你为一张表创建主键(定义 PRIMARY KEY)时,此时这张表的聚簇索引就是主键索引。
建议:通常情况下,应该为一张表设置一个主键。如果没有合适的列作为主键列,可以定义一个自动递增的唯一列为主键。
第2步:无主键但有唯一索引¶
如果一张表中没有设置主键,那么 InnoDB 会使用第一个唯一索引(UNIQUE),且此唯一索引设置了非空约束(NOT NULL),作为聚簇索引。
第3步:都没有¶
如果一张表既没有主键索引,又没有符合条件的唯一索引,那么 InnoDB 会生成一个名为 GEN_CLUST_INDEX 的隐藏聚簇索引。
- 隐藏索引类型:6字节的长整数类型
三、总结¶
| 情况 | 聚簇索引 |
|---|---|
| 有主键 | 主键索引 |
| 无主键,但有非空唯一索引 | 第一个非空唯一索引 |
| 两者都没有 | 隐藏索引 GENCLUSTINDEX(6字节长整型) |
核心结论: - 聚簇索引用于存储行数据 - 一般情况下 = 主键索引 - 但可能有特殊情况,需要理解其完整诞生过程