面试突击57:聚簇索引=主键索引吗?

在 InnoDB 引擎中,每张表都会有一个特殊的索引“聚簇索引”,也被称之为聚集索引,它是用来存储行数据的。一般情况下,聚簇索引等同于主键索引,但这里有一个前提条件,那就是这张表需要有主键,只有有了主键,它才能有主键索引,有主键索引才能等于聚簇索引。

所以看到这里,我们应该明白一个道理:聚簇索引并不完全等于主键索引,因为一张表从结构上来讲,可以没有主键(索引),如果没有主键(索引),那么聚簇索引就不再是主键索引了。
那 InnoDB 中的聚簇索引到底是啥?

聚簇索引诞生过程

在 InnoDB 引擎下,聚簇索引的诞生过程如下:

  1. 当你为一张表创建主键时,也就是定义 PRIMARY KEY 时,此时这张表的聚簇索引就是主键索引。通常情况下,我们应该为一张表设置一个主键,如果没有合适的列作为主键列,我们可以定义一个自动递增的唯一列为主键,并且在插入数据时是自动填充此列。

  2. 然而,如果一张表中没有设置主键,那么 InnoDB 会使用第一个唯一索引(unique),且此唯一索引设置了非空约束(not null),我们就使用它作为聚簇索引。

  3. 如果一张表既没有主键索引,又没有符合条件的唯一索引,那么 InnoDB 会生成一个名为 GEN_CLUST_INDEX 的隐藏聚簇索引,这个隐藏的索引为 6 字节的长整数类型。

    总结

    在 InnoDB 引擎中,每张表都会有一个特殊的索引“聚簇索引”,一般情况下聚簇索引等于主键索引,但聚簇索引又不完全等于主键索引,因为一张表中没有主键索引,那么聚簇索引会使用第一个唯一索引(此列必须为 not null),如果以上情况都不满足,那么 InnoDB 会生成一个隐藏的聚簇索引。

参考 & 鸣谢

dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java面试真题解析

面试合集:https://gitee.com/mydb/interview

相关文章

在 Java 语言中,提高程序的执行效率有两种实现方法,一个是...
在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识...
在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另...
在 Java 语言中,并发编程都是通过创建线程池来实现的,而线...
sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且...
在 Java 中,线程的创建方法有 7 种,分为以下 3 大类: 继承...