数据库自增ID用完了会怎样

起步

对DBA来说这应该是送分题吧。而我是突如其来的想法想测试下的。正常来说程序员是不会关心自增ID用完的情况的。

以 Mysql 为例,它支持的最大的整型是 unsigned bigint
,上限是 2 的 64 次次方。假设每秒记录100万条数据的增长,用完自增ID要58万年以后了。

自增ID用完了会怎样,什么报错

那要是真的58万年以后了呢。就是要探究下用光了会怎样。在我的 Mysql 5.7 它的报错是:

SQL Error (167): Out of range value for column 'id'.

也有人在其他版本测出来的报错是:

Duplicate entry '*****' for key 'PRIMARY'

可以看出,不同的数据库底层实现不一样,不同版本也有差异。只能知道会报错,具体报错信息是什么不好说,可能是数据越界,也可能是主键冲突。

补充

另外,另一个让程序员不关心自增ID用完的原因是。MySQL单机单表的处理能力是千万级别。当单表数据达到1千万时,MySQL性能就会开始下降,需要着手优化,这里的瓶颈主要是查询耗时。
我们可以通过分区再撑一段时间,当数据量到10亿时,基本到了MySQL的极限,不分表分库的话,业务难以持续。如果分表分库的话那么自增ID就很难保证唯一性,这时候就得弃用自增ID,采用其他算法(如uuid)。
总的来说,从业务的角度来讲自增ID不可能用完,单表也支撑不了那么大的数据量。不用担心自增ID用完的情况。