✅MySQL的主键一定是自增的吗?

典型回答

不是的,主键是可以自己选择的,我们可以选择任意一种数据类型作为主键。

但是一般都是单独创建一个自增字段作为主键,主要能带来以下几个好处:

  1. 索引大小更小:使用自增主键可以确保主键的递增性,使得新插入的数据都会在索引的末尾处,减少了数据页的分裂和页分裂导致的IO操作,使得索引大小更小,查询速度更快。
  2. 索引顺序和插入顺序相同:使用自增主键可以保证索引顺序和插入顺序相同,减少了插入新数据时索引的重新排序,提高了插入速度。
  3. 安全性:使用自增主键可以避免主键重复的情况,确保数据完整性和唯一性。
  4. 减少页分裂(合并)及内存碎片。

✅什么是InnoDB的叶分裂和叶合并

另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等。

扩展知识

如果没有定义主键怎么办?

如果我们在一张表中没有定义主键,那么,MySQL会默认选择一个唯一的非空索引作为聚簇索引。

如果没有适合的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。

这个隐藏的主键包含一个自增列和一个6字节的定长记录指针,对用户透明,即用户无法看到或修改这个列,但可以通过使用该列来进行排序或连接操作。

原文: https://www.yuque.com/hollis666/xkm7k3/glycgnryk8953c24