主题
面试速答(先看这里)
**一句话结论:**不是的,主键是可以自己选择的,我们可以选择任意一种数据类型作为主键。
60秒标准回答:
不是的,主键是可以自己选择的,我们可以选择任意一种数据类型作为主键
但是一般都是单独创建一个自增字段作为主键,主要能带来以下几个好处
另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**但是一般都是单独创建一个自增字段作为主键,主要能带来以下几个好处:
- **要点2:**另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等。
- **要点3:**如果我们在一张表中没有定义主键,那么,MySQL会默认选择一个 非空的唯一索引 作为聚簇索引。
- **要点4:**如果没有适合的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。
- **要点5:**这个隐藏的主键包含一个自增列和一个6字节的定长记录指针,对用户透明,即用户无法看到或修改这个列,但可以通过使用该列来进行排序或连接操作。
**记忆锚点:**作为聚簇索引 → MySQL → 插入的数据都会在索引 → 少了插入新数据时索引 → 非空的唯一索引 → row_id
易错提醒:
- 安全性:使用自增主键可以避免主键重复的情况,确保数据完整性和唯一性。
- 另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等。
加分表达:
- 如果我们在一张表中没有定义主键,那么,MySQL会默认选择一个 非空的唯一索引 作为聚簇索引。
- 如果没有适合的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。
- 这个隐藏的主键包含一个自增列和一个6字节的定长记录指针,对用户透明,即用户无法看到或修改这个列,但可以通过使用该列来进行排序或连接操作。
追问准备:
- 围绕「作为聚簇索引」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「MySQL」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「插入的数据都会在索引」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
不是的,主键是可以自己选择的,我们可以选择任意一种数据类型作为主键。
但是一般都是单独创建一个自增字段作为主键,主要能带来以下几个好处:
- 索引大小更小:使用自增主键可以确保主键的递增性,使得新插入的数据都会在索引的末尾处,减少了数据页的分裂和页分裂导致的IO操作,使得索引大小更小,查询速度更快。
- 索引顺序和插入顺序相同:使用自增主键可以保证索引顺序和插入顺序相同,减少了插入新数据时索引的重新排序,提高了插入速度。
- 安全性:使用自增主键可以避免主键重复的情况,确保数据完整性和唯一性。
- 减少页分裂(合并)及内存碎片。
另外,即使我们用了自增字段作为主键,最后体现在数据库上,字段也可能不是连续自增的,比如做了某一次插入失败但是主键ID被占用了,比如数据做了删除,比如做了回滚、比如做了数据订正等等。
扩展知识
如果没有定义主键怎么办?
如果我们在一张表中没有定义主键,那么,MySQL会默认选择一个非空的唯一索引作为聚簇索引。
如果没有适合的非空唯一索引,则会创建一个隐藏的主键(row_id)作为聚簇索引。
这个隐藏的主键包含一个自增列和一个6字节的定长记录指针,对用户透明,即用户无法看到或修改这个列,但可以通过使用该列来进行排序或连接操作。