通过一些问题来谈论 Mysql 中的自增主键
- 默认情况下我们会使用自增主键,你觉得为什么要用自增的主键?有什么好处?
- 自增主键的话,如果用 INT,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?
1. 默认情况下我们会使用自增主见,你觉得为什么要用自增的主键?有什么好处?
使用自增主键主要是从性能和存储两个方面去考虑的
InnoDB 索引底层结构是 B+ 树,其为了维护索引有序性,在插入新值时需要做必要的维护。如果主键是递增的话,在只需要在节点末尾插入一个新纪录即可。若是新主键在中间插入,则需要逻辑上挪动后面的数据,空出位置。如果最后一个节点的数据满了,会再申请一个数据页,然后挪动部分数据过去,这个过程称为页分裂,性能就会受到影响
其次,假设表中有个唯一字段,比如字符串类型的身份证号,那应该用身份证号做主键,还是用自增字段做主键呢?
由于每个非主键索引的叶子节点存储了主键值。使用身份证号做主键的每个非主键索引叶子节点的大小约为 20 字节,而如果使用自增主键,则只要 4 个字节,如果是长整型也就 8 个字节。
所以,主键长度越小,非主键索引的叶子节点越小,其占用的空间也就越少
因此,默认情况下还是使用自增主键会比较合适。
2. 自增主键的话,如果用 INT,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?
INT 类型的自增主键的最大数是 2^32 - 1(4294967295),如果达到这个值,后面再插入的话,得到的值将会保持不变
可以看到,第一条插入语句还是成功的,第二条插入语句就失败了,证明了 INT 类型的自增主键超过了最大值后申请的 id 还是一样的
如果超过了最大数,简单点的方法就是直接修改为 BIGINT,但存储和索引开销会增大
诚恳欢迎大家提出意见Orz
......(待续未完