自增主键用完了怎么办?

这篇咱们来聊一聊mysql表的主键问题。

先抛出两个问题:

问题一:是使用uuid还是自增主键?

问题二:如果自增主键用完了,如何解决?

那么遇到这种问题怎么来回答呢?

我们这篇文章就来解决一下上述问题。

问题一:是使用uuid还是自增主键?

最好是用自增主键,主要是以下两个原因:

1. 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
  2. 如果使用非自增主键(如uuid),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到索引页的随机某个位置,此时MySQL为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成索引碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

不过,也不是所有的场景下都得使用自增主键,可能场景下,主键必须自己生成,不在乎那些性能的开销。那也没有问题。

问题二:如果自增主键用完了,如何解决?

首先,我们要明白一点,在mysql中,int整型的范围如下:

img

我们以无符号整型为例,存储范围为0~4294967295,约43亿!我们先说一下,一旦自增id达到最大值,此时数据继续插入是会报一个主键冲突异常如下所示

//Duplicate entry '4294967295' for key 'PRIMARY'

那解决方法也是很简单的,将Int类型改为BigInt类型,BigInt的范围如下:

img

就算你每秒10000条数据,跑100年,单表的数据也才 10000*24*3600*365*100=31536000000000

这数字距离BigInt的上限还差的远,因此你将自增ID设为BigInt类型,你是不用考虑自增ID达到最大值这个问题!

这时候你如果回答:把自增主键的类型改为BigInt类型就好了。

那么后续会有更多问题(坑):比如你在线上怎么修改列的数据类型的?

那么关于问题 “ 如果自增主键用完了如何解决”,专业的回答是什么呢?
你回答:这问题没遇到过,因为自增主键一般用int类型,一般达不到最大值,就会进行分库分表了,所以不曾遇见过这种问题。

图片来自与孤独烟。

猜你喜欢

转载自blog.csdn.net/hello_cmy/article/details/112837432