Skip to content

面试速答(先看这里)

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

60秒标准回答:

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

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

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

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**但是一般都是单独创建一个自增字段作为主键,主要能带来以下几个好处:
  • **要点2:**另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等。
  • **要点3:**如果我们在一张表中没有定义主键,那么,MySQL会默认选择一个 非空的唯一索引 作为聚簇索引。
  • **要点4:**如果没有适合的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。
  • **要点5:**这个隐藏的主键包含一个自增列和一个6字节的定长记录指针,对用户透明,即用户无法看到或修改这个列,但可以通过使用该列来进行排序或连接操作。

**记忆锚点:**作为聚簇索引 → MySQL → 插入的数据都会在索引 → 少了插入新数据时索引 → 非空的唯一索引 → row_id

易错提醒:

  • 安全性:使用自增主键可以避免主键重复的情况,确保数据完整性和唯一性。
  • 另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等。

加分表达:

  • 如果我们在一张表中没有定义主键,那么,MySQL会默认选择一个 非空的唯一索引 作为聚簇索引。
  • 如果没有适合的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。
  • 这个隐藏的主键包含一个自增列和一个6字节的定长记录指针,对用户透明,即用户无法看到或修改这个列,但可以通过使用该列来进行排序或连接操作。

追问准备:

  • 围绕「作为聚簇索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「MySQL」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「插入的数据都会在索引」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

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

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

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

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

打开文档:✅什么是InnoDB的叶分裂和叶合并

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

扩展知识 ​

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

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

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

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